mirror of
https://github.com/isar/libmdbx.git
synced 2025-04-01 02:32:57 +08:00
mdbx: добавление cursor_reset()
и cursor_drown()
(backport).
This commit is contained in:
parent
2476fba287
commit
33ceba0a5a
@ -12,8 +12,7 @@ MDBX_cursor *mdbx_cursor_create(void *context) {
|
||||
couple->outer.signature = cur_signature_ready4dispose;
|
||||
couple->outer.next = &couple->outer;
|
||||
couple->userctx = context;
|
||||
couple->outer.top_and_flags = z_poor_mark;
|
||||
couple->inner.cursor.top_and_flags = z_poor_mark | z_inner;
|
||||
cursor_reset(couple);
|
||||
VALGRIND_MAKE_MEM_DEFINED(&couple->outer.backup, sizeof(couple->outer.backup));
|
||||
VALGRIND_MAKE_MEM_DEFINED(&couple->outer.tree, sizeof(couple->outer.tree));
|
||||
VALGRIND_MAKE_MEM_DEFINED(&couple->outer.clc, sizeof(couple->outer.clc));
|
||||
@ -31,13 +30,15 @@ int mdbx_cursor_reset(MDBX_cursor *mc) {
|
||||
if (unlikely(!mc))
|
||||
return LOG_IFERR(MDBX_EINVAL);
|
||||
|
||||
if (unlikely(mc->signature != cur_signature_ready4dispose && mc->signature != cur_signature_live))
|
||||
return LOG_IFERR(MDBX_EBADSIGN);
|
||||
if (likely(mc->signature == cur_signature_live)) {
|
||||
cursor_reset((cursor_couple_t *)mc);
|
||||
return MDBX_SUCCESS;
|
||||
}
|
||||
|
||||
cursor_couple_t *couple = (cursor_couple_t *)mc;
|
||||
couple->outer.top_and_flags = z_poor_mark;
|
||||
couple->inner.cursor.top_and_flags = z_poor_mark | z_inner;
|
||||
return MDBX_SUCCESS;
|
||||
if (likely(mc->signature == cur_signature_ready4dispose))
|
||||
return MDBX_SUCCESS;
|
||||
|
||||
return LOG_IFERR(MDBX_EBADSIGN);
|
||||
}
|
||||
|
||||
int mdbx_cursor_bind(MDBX_txn *txn, MDBX_cursor *mc, MDBX_dbi dbi) {
|
||||
@ -112,7 +113,7 @@ int mdbx_cursor_unbind(MDBX_cursor *mc) {
|
||||
}
|
||||
mc->next = mc;
|
||||
}
|
||||
be_poor(mc);
|
||||
cursor_drown((cursor_couple_t *)mc);
|
||||
mc->signature = cur_signature_ready4dispose;
|
||||
return MDBX_SUCCESS;
|
||||
}
|
||||
@ -221,10 +222,9 @@ int mdbx_txn_release_all_cursors_ex(const MDBX_txn *txn, bool unbind, size_t *co
|
||||
ENSURE(nullptr, mc->signature == cur_signature_live && (mc->next != mc) && !mc->backup);
|
||||
txn->cursors[i] = mc->next;
|
||||
mc->next = mc;
|
||||
if (unbind) {
|
||||
be_poor(mc);
|
||||
mc->signature = cur_signature_ready4dispose;
|
||||
} else {
|
||||
mc->signature = cur_signature_ready4dispose;
|
||||
cursor_drown((cursor_couple_t *)mc);
|
||||
if (!unbind) {
|
||||
mc->signature = 0;
|
||||
osal_free(mc);
|
||||
}
|
||||
|
@ -218,7 +218,6 @@ int cursor_shadow(MDBX_cursor *mc, MDBX_txn *nested, const size_t dbi) {
|
||||
|
||||
MDBX_cursor *cursor_eot(MDBX_cursor *mc, MDBX_txn *txn, const bool merge) {
|
||||
MDBX_cursor *const next = mc->next;
|
||||
mc->next = mc;
|
||||
const unsigned stage = mc->signature;
|
||||
MDBX_cursor *const bk = mc->backup;
|
||||
ENSURE(txn->env, stage == cur_signature_live || (stage == cur_signature_wait4eot && bk));
|
||||
@ -253,6 +252,8 @@ MDBX_cursor *cursor_eot(MDBX_cursor *mc, MDBX_txn *txn, const bool merge) {
|
||||
osal_free(bk);
|
||||
} else {
|
||||
ENSURE(mc->txn->env, stage == cur_signature_live);
|
||||
cursor_drown((cursor_couple_t *)mc);
|
||||
mc->next = mc;
|
||||
mc->signature = cur_signature_ready4dispose /* Cursor may be reused */;
|
||||
}
|
||||
return next;
|
||||
|
16
src/cursor.h
16
src/cursor.h
@ -355,3 +355,19 @@ MDBX_MAYBE_UNUSED static inline void cursor_inner_refresh(const MDBX_cursor *mc,
|
||||
}
|
||||
|
||||
MDBX_MAYBE_UNUSED MDBX_INTERNAL bool cursor_is_tracked(const MDBX_cursor *mc);
|
||||
|
||||
static inline void cursor_reset(cursor_couple_t *couple) {
|
||||
couple->outer.top_and_flags = z_fresh_mark;
|
||||
couple->inner.cursor.top_and_flags = z_fresh_mark | z_inner;
|
||||
}
|
||||
|
||||
static inline void cursor_drown(cursor_couple_t *couple) {
|
||||
couple->outer.top_and_flags = z_poor_mark;
|
||||
couple->inner.cursor.top_and_flags = z_poor_mark | z_inner;
|
||||
couple->outer.txn = nullptr;
|
||||
couple->inner.cursor.txn = nullptr;
|
||||
couple->outer.tree = nullptr;
|
||||
/* сохраняем clc-указатель, так он используется для вычисления dbi в mdbx_cursor_renew(). */
|
||||
couple->outer.dbi_state = nullptr;
|
||||
couple->inner.cursor.dbi_state = nullptr;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user