handle xcursor unref'ing

vl32b
Howard Chu 9 years ago
parent d6e3b18f1c
commit 7b879ca97d
  1. 49
      libraries/liblmdb/mdb.c

@ -1922,6 +1922,20 @@ mdb_page_unref(MDB_txn *txn, MDB_page *mp)
}
}
#define MDB_PAGE_UNREF(txn, mp) mdb_page_unref(txn, mp)
static void
mdb_xcursor_unref(MDB_cursor *mc)
{
MDB_cursor *m2 = &mc->mc_xcursor->mx_cursor;
int i;
if (IS_SUBP(m2->mc_pg[0]))
return;
for (i=0; i<m2->mc_snum; i++)
mdb_page_unref(mc->mc_txn, m2->mc_pg[i]);
m2->mc_snum = m2->mc_top = 0;
m2->mc_pg[0] = NULL;
m2->mc_flags &= ~C_INITIALIZED;
}
#else
#define MDB_PAGE_UNREF(txn, mp)
#endif /* MDB_VL32 */
@ -6029,6 +6043,13 @@ mdb_cursor_next(MDB_cursor *mc, MDB_val *key, MDB_val *data, MDB_cursor_op op)
return rc;
}
}
#ifdef MDB_VL32
else {
if (mc->mc_xcursor->mx_cursor.mc_flags & C_INITIALIZED) {
mdb_xcursor_unref(mc);
}
}
#endif
} else {
mc->mc_xcursor->mx_cursor.mc_flags &= ~(C_INITIALIZED|C_EOF);
if (op == MDB_NEXT_DUP)
@ -6108,6 +6129,13 @@ mdb_cursor_prev(MDB_cursor *mc, MDB_val *key, MDB_val *data, MDB_cursor_op op)
return rc;
}
}
#ifdef MDB_VL32
else {
if (mc->mc_xcursor->mx_cursor.mc_flags & C_INITIALIZED) {
mdb_xcursor_unref(mc);
}
}
#endif
} else {
mc->mc_xcursor->mx_cursor.mc_flags &= ~(C_INITIALIZED|C_EOF);
if (op == MDB_PREV_DUP)
@ -6307,6 +6335,11 @@ set1:
return MDB_SUCCESS;
}
#ifdef MDB_VL32
if (mc->mc_xcursor && mc->mc_xcursor->mx_cursor.mc_flags & C_INITIALIZED) {
mdb_xcursor_unref(mc);
}
#endif
if (F_ISSET(leaf->mn_flags, F_DUPDATA)) {
mdb_xcursor_init1(mc, leaf);
}
@ -6367,8 +6400,14 @@ mdb_cursor_first(MDB_cursor *mc, MDB_val *key, MDB_val *data)
int rc;
MDB_node *leaf;
if (mc->mc_xcursor)
if (mc->mc_xcursor) {
#ifdef MDB_VL32
if (mc->mc_xcursor->mx_cursor.mc_flags & C_INITIALIZED) {
mdb_xcursor_unref(mc);
}
#endif
mc->mc_xcursor->mx_cursor.mc_flags &= ~(C_INITIALIZED|C_EOF);
}
if (!(mc->mc_flags & C_INITIALIZED) || mc->mc_top) {
rc = mdb_page_search(mc, NULL, MDB_PS_FIRST);
@ -6411,8 +6450,14 @@ mdb_cursor_last(MDB_cursor *mc, MDB_val *key, MDB_val *data)
int rc;
MDB_node *leaf;
if (mc->mc_xcursor)
if (mc->mc_xcursor) {
#ifdef MDB_VL32
if (mc->mc_xcursor->mx_cursor.mc_flags & C_INITIALIZED) {
mdb_xcursor_unref(mc);
}
#endif
mc->mc_xcursor->mx_cursor.mc_flags &= ~(C_INITIALIZED|C_EOF);
}
if (!(mc->mc_flags & C_EOF)) {

Loading…
Cancel
Save