From acbff5b1eac9950c04780f8bcb4933cbc38fc9d8 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Mon, 17 Sep 2012 04:41:13 -0700 Subject: [PATCH] Add mdb_cursor_renew() Allow cursors on read-only txns to be reused with later txns. --- libraries/libmdb/mdb.c | 13 +++++++++++++ libraries/libmdb/mdb.h | 17 +++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/libraries/libmdb/mdb.c b/libraries/libmdb/mdb.c index ed1ecbb..345ebf4 100644 --- a/libraries/libmdb/mdb.c +++ b/libraries/libmdb/mdb.c @@ -5285,6 +5285,19 @@ mdb_cursor_open(MDB_txn *txn, MDB_dbi dbi, MDB_cursor **ret) return MDB_SUCCESS; } +int +mdb_cursor_renew(MDB_txn *txn, MDB_cursor *mc) +{ + if (txn == NULL || mc == NULL || mc->mc_dbi >= txn->mt_numdbs) + return EINVAL; + + if (txn->mt_cursors) + return EINVAL; + + mdb_cursor_init(mc, txn, mc->mc_dbi, mc->mc_xcursor); + return MDB_SUCCESS; +} + /* Return the count of duplicate data items for the current key */ int mdb_cursor_count(MDB_cursor *mc, size_t *countp) diff --git a/libraries/libmdb/mdb.h b/libraries/libmdb/mdb.h index 43eb789..6e9cd2b 100644 --- a/libraries/libmdb/mdb.h +++ b/libraries/libmdb/mdb.h @@ -904,6 +904,23 @@ int mdb_cursor_open(MDB_txn *txn, MDB_dbi dbi, MDB_cursor **cursor); */ void mdb_cursor_close(MDB_cursor *cursor); + /** @brief Renew a cursor handle. + * + * Cursors are associated with a specific transaction and database and + * may not span threads. Cursors that are only used in read-only + * transactions may be re-used, to avoid unnecessary malloc/free overhead. + * The cursor may be associated with a new read-only transaction, and + * referencing the same database handle as it was created with. + * @param[in] txn A transaction handle returned by #mdb_txn_begin() + * @param[in] cursor A cursor handle returned by #mdb_cursor_open() + * @return A non-zero error value on failure and 0 on success. Some possible + * errors are: + * + */ +int mdb_cursor_renew(MDB_txn *txn, MDB_cursor *cursor); + /** @brief Return the cursor's transaction handle. * * @param[in] cursor A cursor handle returned by #mdb_cursor_open()