mdbx: рефакторинг cursor_eot() для упрощения txn_done_cursors().

This commit is contained in:
Леонид Юрьев (Leonid Yuriev) 2025-03-06 10:29:57 +03:00
parent 436998ca83
commit 333069e7a8
4 changed files with 19 additions and 19 deletions

View File

@ -214,18 +214,21 @@ int cursor_shadow(MDBX_cursor *cursor, MDBX_txn *nested, const size_t dbi) {
return MDBX_SUCCESS; return MDBX_SUCCESS;
} }
void cursor_eot(MDBX_cursor *cursor) { MDBX_cursor *cursor_eot(MDBX_cursor *cursor, MDBX_txn *txn) {
MDBX_cursor *const next = cursor->next;
cursor->next = cursor;
const unsigned stage = cursor->signature; const unsigned stage = cursor->signature;
MDBX_cursor *const shadow = cursor->backup; MDBX_cursor *const shadow = cursor->backup;
ENSURE(cursor->txn->env, stage == cur_signature_live || (stage == cur_signature_wait4eot && shadow)); ENSURE(txn->env, stage == cur_signature_live || (stage == cur_signature_wait4eot && shadow));
tASSERT(txn, cursor->txn == txn);
if (shadow) { if (shadow) {
subcur_t *subcur = cursor->subcur; subcur_t *subcur = cursor->subcur;
cASSERT(cursor, cursor->txn->parent != nullptr); tASSERT(txn, txn->parent != nullptr && shadow->txn == txn->parent);
/* Zap: Using uninitialized memory '*cursor->backup'. */ /* Zap: Using uninitialized memory '*mc->backup'. */
MDBX_SUPPRESS_GOOFY_MSVC_ANALYZER(6001); MDBX_SUPPRESS_GOOFY_MSVC_ANALYZER(6001);
ENSURE(cursor->txn->env, shadow->signature == cur_signature_live); ENSURE(txn->env, shadow->signature == cur_signature_live);
cASSERT(cursor, subcur == shadow->subcur); tASSERT(txn, subcur == shadow->subcur);
if (((cursor->txn->flags | cursor->txn->parent->flags) & MDBX_TXN_ERROR) == 0) { if ((txn->flags & MDBX_TXN_ERROR) == 0) {
/* Update pointers to parent txn */ /* Update pointers to parent txn */
cursor->next = shadow->next; cursor->next = shadow->next;
cursor->backup = shadow->backup; cursor->backup = shadow->backup;
@ -233,25 +236,24 @@ void cursor_eot(MDBX_cursor *cursor) {
cursor->tree = shadow->tree; cursor->tree = shadow->tree;
cursor->dbi_state = shadow->dbi_state; cursor->dbi_state = shadow->dbi_state;
if (subcur) { if (subcur) {
subcur->cursor.txn = cursor->txn; subcur->cursor.txn = shadow->txn;
subcur->cursor.dbi_state = cursor->dbi_state; subcur->cursor.dbi_state = shadow->dbi_state;
} }
} else { } else {
/* Restore from backup, i.e. rollback/abort nested txn */ /* Restore from backup, i.e. rollback/abort nested txn */
*cursor = *shadow; *cursor = *shadow;
cursor->signature = stage /* Promote (cur_signature_wait4eot) state to parent txn */;
if (subcur) if (subcur)
*subcur = *(subcur_t *)(shadow + 1); *subcur = *(subcur_t *)(shadow + 1);
} }
if (stage == cur_signature_wait4eot /* Cursor was closed by user */)
cursor->signature = stage /* Promote closed state to parent txn */;
shadow->signature = 0; shadow->signature = 0;
osal_free(shadow); osal_free(shadow);
} else { } else {
ENSURE(cursor->txn->env, stage == cur_signature_live); ENSURE(cursor->txn->env, stage == cur_signature_live);
be_poor(cursor); be_poor(cursor);
cursor->signature = cur_signature_ready4dispose /* Cursor may be reused */; cursor->signature = cur_signature_ready4dispose /* Cursor may be reused */;
cursor->next = cursor;
} }
return next;
} }
/*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/

View File

@ -292,7 +292,7 @@ MDBX_NOTHROW_PURE_FUNCTION static inline bool check_leaf_type(const MDBX_cursor
return (((page_type(mp) ^ mc->checking) & (z_branch | z_leaf | z_largepage | z_dupfix)) == 0); return (((page_type(mp) ^ mc->checking) & (z_branch | z_leaf | z_largepage | z_dupfix)) == 0);
} }
MDBX_INTERNAL void cursor_eot(MDBX_cursor *cursor); MDBX_INTERNAL MDBX_cursor *cursor_eot(MDBX_cursor *cursor, MDBX_txn *txn);
MDBX_INTERNAL int cursor_shadow(MDBX_cursor *cursor, MDBX_txn *nested, const size_t dbi); MDBX_INTERNAL int cursor_shadow(MDBX_cursor *cursor, MDBX_txn *nested, const size_t dbi);
MDBX_INTERNAL MDBX_cursor *cursor_cpstk(const MDBX_cursor *csrc, MDBX_cursor *cdst); MDBX_INTERNAL MDBX_cursor *cursor_cpstk(const MDBX_cursor *csrc, MDBX_cursor *cdst);

View File

@ -101,7 +101,7 @@ static inline bool dbi_changed(const MDBX_txn *txn, const size_t dbi) {
const MDBX_env *const env = txn->env; const MDBX_env *const env = txn->env;
eASSERT(env, dbi_state(txn, dbi) & DBI_LINDO); eASSERT(env, dbi_state(txn, dbi) & DBI_LINDO);
const uint32_t snap_seq = atomic_load32(&env->dbi_seqs[dbi], mo_AcquireRelease); const uint32_t snap_seq = atomic_load32(&env->dbi_seqs[dbi], mo_AcquireRelease);
return snap_seq != txn->dbi_seqs[dbi]; return unlikely(snap_seq != txn->dbi_seqs[dbi]);
} }
static inline int dbi_check(const MDBX_txn *txn, const size_t dbi) { static inline int dbi_check(const MDBX_txn *txn, const size_t dbi) {

View File

@ -15,11 +15,9 @@ void txn_done_cursors(MDBX_txn *txn) {
MDBX_cursor *cursor = txn->cursors[i]; MDBX_cursor *cursor = txn->cursors[i];
if (cursor) { if (cursor) {
txn->cursors[i] = nullptr; txn->cursors[i] = nullptr;
do { do
MDBX_cursor *const next = cursor->next; cursor = cursor_eot(cursor, txn);
cursor_eot(cursor); while (cursor);
cursor = next;
} while (cursor);
} }
} }
txn->flags &= ~txn_may_have_cursors; txn->flags &= ~txn_may_have_cursors;