mirror of
https://github.com/isar/libmdbx.git
synced 2025-04-01 02:32:57 +08:00
mdbx: рефакторинг cursor_eot()
для упрощения txn_done_cursors()
.
This commit is contained in:
parent
436998ca83
commit
333069e7a8
26
src/cursor.c
26
src/cursor.c
@ -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;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
@ -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);
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user