mirror of
https://github.com/isar/libmdbx.git
synced 2025-01-20 00:48:20 +08:00
mdbx: рефакторинг/вычленение txn_basal_create/destroy()
.
This commit is contained in:
parent
67460dd0fd
commit
b681b59434
@ -482,39 +482,12 @@ __cold int mdbx_env_openW(MDBX_env *env, const wchar_t *pathname, MDBX_env_flags
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ((flags & MDBX_RDONLY) == 0) {
|
if ((flags & MDBX_RDONLY) == 0) {
|
||||||
MDBX_txn *txn = nullptr;
|
env->basal_txn = txn_basal_create(env->max_dbi);
|
||||||
const intptr_t bitmap_bytes =
|
if (unlikely(!env->basal_txn)) {
|
||||||
#if MDBX_ENABLE_DBI_SPARSE
|
|
||||||
ceil_powerof2(env->max_dbi, CHAR_BIT * sizeof(txn->dbi_sparse[0])) / CHAR_BIT;
|
|
||||||
#else
|
|
||||||
0;
|
|
||||||
#endif /* MDBX_ENABLE_DBI_SPARSE */
|
|
||||||
const size_t base = sizeof(MDBX_txn) + sizeof(cursor_couple_t);
|
|
||||||
const size_t size = base + bitmap_bytes +
|
|
||||||
env->max_dbi * (sizeof(txn->dbs[0]) + sizeof(txn->cursors[0]) + sizeof(txn->dbi_seqs[0]) +
|
|
||||||
sizeof(txn->dbi_state[0]));
|
|
||||||
|
|
||||||
txn = osal_calloc(1, size);
|
|
||||||
if (unlikely(!txn)) {
|
|
||||||
rc = MDBX_ENOMEM;
|
|
||||||
goto bailout;
|
|
||||||
}
|
|
||||||
txn->dbs = ptr_disp(txn, base);
|
|
||||||
txn->cursors = ptr_disp(txn->dbs, env->max_dbi * sizeof(txn->dbs[0]));
|
|
||||||
txn->dbi_seqs = ptr_disp(txn->cursors, env->max_dbi * sizeof(txn->cursors[0]));
|
|
||||||
txn->dbi_state = ptr_disp(txn, size - env->max_dbi * sizeof(txn->dbi_state[0]));
|
|
||||||
#if MDBX_ENABLE_DBI_SPARSE
|
|
||||||
txn->dbi_sparse = ptr_disp(txn->dbi_state, -bitmap_bytes);
|
|
||||||
#endif /* MDBX_ENABLE_DBI_SPARSE */
|
|
||||||
txn->env = env;
|
|
||||||
txn->flags = MDBX_TXN_FINISHED;
|
|
||||||
env->basal_txn = txn;
|
|
||||||
txn->tw.retired_pages = pnl_alloc(MDBX_PNL_INITIAL);
|
|
||||||
txn->tw.repnl = pnl_alloc(MDBX_PNL_INITIAL);
|
|
||||||
if (unlikely(!txn->tw.retired_pages || !txn->tw.repnl)) {
|
|
||||||
rc = MDBX_ENOMEM;
|
rc = MDBX_ENOMEM;
|
||||||
goto bailout;
|
goto bailout;
|
||||||
}
|
}
|
||||||
|
env->basal_txn->env = env;
|
||||||
env_options_adjust_defaults(env);
|
env_options_adjust_defaults(env);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -588,12 +588,7 @@ __cold int env_close(MDBX_env *env, bool resurrect_after_fork) {
|
|||||||
env->pathname.buffer = nullptr;
|
env->pathname.buffer = nullptr;
|
||||||
}
|
}
|
||||||
if (env->basal_txn) {
|
if (env->basal_txn) {
|
||||||
dpl_free(env->basal_txn);
|
txn_basal_destroy(env->basal_txn);
|
||||||
txl_free(env->basal_txn->tw.gc.retxl);
|
|
||||||
pnl_free(env->basal_txn->tw.retired_pages);
|
|
||||||
pnl_free(env->basal_txn->tw.spilled.list);
|
|
||||||
pnl_free(env->basal_txn->tw.repnl);
|
|
||||||
osal_free(env->basal_txn);
|
|
||||||
env->basal_txn = nullptr;
|
env->basal_txn = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -70,6 +70,8 @@ MDBX_INTERNAL int txn_end(MDBX_txn *txn, unsigned mode);
|
|||||||
MDBX_INTERNAL int txn_write(MDBX_txn *txn, iov_ctx_t *ctx);
|
MDBX_INTERNAL int txn_write(MDBX_txn *txn, iov_ctx_t *ctx);
|
||||||
MDBX_INTERNAL void txn_take_gcprof(const MDBX_txn *txn, MDBX_commit_latency *latency);
|
MDBX_INTERNAL void txn_take_gcprof(const MDBX_txn *txn, MDBX_commit_latency *latency);
|
||||||
MDBX_INTERNAL void txn_merge(MDBX_txn *const parent, MDBX_txn *const txn, const size_t parent_retired_len);
|
MDBX_INTERNAL void txn_merge(MDBX_txn *const parent, MDBX_txn *const txn, const size_t parent_retired_len);
|
||||||
|
MDBX_INTERNAL MDBX_txn *txn_basal_create(const size_t max_dbi);
|
||||||
|
MDBX_INTERNAL void txn_basal_destroy(MDBX_txn *txn);
|
||||||
|
|
||||||
/* env.c */
|
/* env.c */
|
||||||
MDBX_INTERNAL int env_open(MDBX_env *env, mdbx_mode_t mode);
|
MDBX_INTERNAL int env_open(MDBX_env *env, mdbx_mode_t mode);
|
||||||
|
44
src/txn.c
44
src/txn.c
@ -1080,3 +1080,47 @@ int txn_unpark(MDBX_txn *txn) {
|
|||||||
int err = txn_end(txn, TXN_END_OUSTED | TXN_END_RESET | TXN_END_UPDATE);
|
int err = txn_end(txn, TXN_END_OUSTED | TXN_END_RESET | TXN_END_UPDATE);
|
||||||
return err ? err : MDBX_OUSTED;
|
return err ? err : MDBX_OUSTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MDBX_txn *txn_basal_create(const size_t max_dbi) {
|
||||||
|
MDBX_txn *txn = nullptr;
|
||||||
|
const intptr_t bitmap_bytes =
|
||||||
|
#if MDBX_ENABLE_DBI_SPARSE
|
||||||
|
ceil_powerof2(max_dbi, CHAR_BIT * sizeof(txn->dbi_sparse[0])) / CHAR_BIT;
|
||||||
|
#else
|
||||||
|
0;
|
||||||
|
#endif /* MDBX_ENABLE_DBI_SPARSE */
|
||||||
|
const size_t base = sizeof(MDBX_txn) + /* GC cursor */ sizeof(cursor_couple_t);
|
||||||
|
const size_t size =
|
||||||
|
base + bitmap_bytes +
|
||||||
|
max_dbi * (sizeof(txn->dbs[0]) + sizeof(txn->cursors[0]) + sizeof(txn->dbi_seqs[0]) + sizeof(txn->dbi_state[0]));
|
||||||
|
|
||||||
|
txn = osal_calloc(1, size);
|
||||||
|
if (unlikely(!txn))
|
||||||
|
return txn;
|
||||||
|
|
||||||
|
txn->dbs = ptr_disp(txn, base);
|
||||||
|
txn->cursors = ptr_disp(txn->dbs, max_dbi * sizeof(txn->dbs[0]));
|
||||||
|
txn->dbi_seqs = ptr_disp(txn->cursors, max_dbi * sizeof(txn->cursors[0]));
|
||||||
|
txn->dbi_state = ptr_disp(txn, size - max_dbi * sizeof(txn->dbi_state[0]));
|
||||||
|
#if MDBX_ENABLE_DBI_SPARSE
|
||||||
|
txn->dbi_sparse = ptr_disp(txn->dbi_state, -bitmap_bytes);
|
||||||
|
#endif /* MDBX_ENABLE_DBI_SPARSE */
|
||||||
|
txn->flags = MDBX_TXN_FINISHED;
|
||||||
|
txn->tw.retired_pages = pnl_alloc(MDBX_PNL_INITIAL);
|
||||||
|
txn->tw.repnl = pnl_alloc(MDBX_PNL_INITIAL);
|
||||||
|
if (unlikely(!txn->tw.retired_pages || !txn->tw.repnl)) {
|
||||||
|
txn_basal_destroy(txn);
|
||||||
|
txn = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return txn;
|
||||||
|
}
|
||||||
|
|
||||||
|
void txn_basal_destroy(MDBX_txn *txn) {
|
||||||
|
dpl_free(txn);
|
||||||
|
txl_free(txn->tw.gc.retxl);
|
||||||
|
pnl_free(txn->tw.retired_pages);
|
||||||
|
pnl_free(txn->tw.spilled.list);
|
||||||
|
pnl_free(txn->tw.repnl);
|
||||||
|
osal_free(txn);
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user