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;
}
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;
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) {
subcur_t *subcur = cursor->subcur;
cASSERT(cursor, cursor->txn->parent != nullptr);
/* Zap: Using uninitialized memory '*cursor->backup'. */
tASSERT(txn, txn->parent != nullptr && shadow->txn == txn->parent);
/* Zap: Using uninitialized memory '*mc->backup'. */
MDBX_SUPPRESS_GOOFY_MSVC_ANALYZER(6001);
ENSURE(cursor->txn->env, shadow->signature == cur_signature_live);
cASSERT(cursor, subcur == shadow->subcur);
if (((cursor->txn->flags | cursor->txn->parent->flags) & MDBX_TXN_ERROR) == 0) {
ENSURE(txn->env, shadow->signature == cur_signature_live);
tASSERT(txn, subcur == shadow->subcur);
if ((txn->flags & MDBX_TXN_ERROR) == 0) {
/* Update pointers to parent txn */
cursor->next = shadow->next;
cursor->backup = shadow->backup;
@ -233,25 +236,24 @@ void cursor_eot(MDBX_cursor *cursor) {
cursor->tree = shadow->tree;
cursor->dbi_state = shadow->dbi_state;
if (subcur) {
subcur->cursor.txn = cursor->txn;
subcur->cursor.dbi_state = cursor->dbi_state;
subcur->cursor.txn = shadow->txn;
subcur->cursor.dbi_state = shadow->dbi_state;
}
} else {
/* Restore from backup, i.e. rollback/abort nested txn */
*cursor = *shadow;
cursor->signature = stage /* Promote (cur_signature_wait4eot) state to parent txn */;
if (subcur)
*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;
osal_free(shadow);
} else {
ENSURE(cursor->txn->env, stage == cur_signature_live);
be_poor(cursor);
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);
}
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 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;
eASSERT(env, dbi_state(txn, dbi) & DBI_LINDO);
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) {

View File

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