mdbx-windows: исправление assert-проверок внутри txn_lock()/txn_unlock().

This commit is contained in:
Леонид Юрьев (Leonid Yuriev) 2025-07-14 00:41:48 +03:00
parent 8fba09ceb6
commit 2a41db6b67
2 changed files with 7 additions and 5 deletions

View File

@ -837,7 +837,7 @@ int lck_txn_lock(MDBX_env *env, bool dont_wait) {
void lck_txn_unlock(MDBX_env *env) { void lck_txn_unlock(MDBX_env *env) {
TRACE("%s", ">>"); TRACE("%s", ">>");
if (env->basal_txn) { if (env->basal_txn) {
eASSERT(env, !env->basal_txn || env->basal_txn->owner == osal_thread_self()); eASSERT(env, env->basal_txn->owner == osal_thread_self());
env->basal_txn->owner = 0; env->basal_txn->owner = 0;
} }
int err = osal_ipclock_unlock(env, &env->lck->wrt_lock); int err = osal_ipclock_unlock(env, &env->lck->wrt_lock);

View File

@ -87,7 +87,7 @@ int lck_txn_lock(MDBX_env *env, bool dontwait) {
} }
} }
eASSERT(env, !env->basal_txn->owner); eASSERT(env, !env->basal_txn || !env->basal_txn->owner);
if (env->flags & MDBX_EXCLUSIVE) if (env->flags & MDBX_EXCLUSIVE)
goto done; goto done;
@ -104,10 +104,11 @@ int lck_txn_lock(MDBX_env *env, bool dontwait) {
} }
if (rc == MDBX_SUCCESS) { if (rc == MDBX_SUCCESS) {
done: done:
if (env->basal_txn)
env->basal_txn->owner = osal_thread_self();
/* Zap: Failing to release lock 'env->windowsbug_lock' /* Zap: Failing to release lock 'env->windowsbug_lock'
* in function 'mdbx_txn_lock' */ * in function 'mdbx_txn_lock' */
MDBX_SUPPRESS_GOOFY_MSVC_ANALYZER(26115); MDBX_SUPPRESS_GOOFY_MSVC_ANALYZER(26115);
env->basal_txn->owner = osal_thread_self();
return MDBX_SUCCESS; return MDBX_SUCCESS;
} }
@ -116,13 +117,14 @@ int lck_txn_lock(MDBX_env *env, bool dontwait) {
} }
void lck_txn_unlock(MDBX_env *env) { void lck_txn_unlock(MDBX_env *env) {
eASSERT(env, env->basal_txn->owner == osal_thread_self()); eASSERT(env, !env->basal_txn || env->basal_txn->owner == osal_thread_self());
if ((env->flags & MDBX_EXCLUSIVE) == 0) { if ((env->flags & MDBX_EXCLUSIVE) == 0) {
const HANDLE fd4data = env->ioring.overlapped_fd ? env->ioring.overlapped_fd : env->lazy_fd; const HANDLE fd4data = env->ioring.overlapped_fd ? env->ioring.overlapped_fd : env->lazy_fd;
int err = funlock(fd4data, DXB_BODY); int err = funlock(fd4data, DXB_BODY);
if (err != MDBX_SUCCESS) if (err != MDBX_SUCCESS)
mdbx_panic("%s failed: err %u", __func__, err); mdbx_panic("%s failed: err %u", __func__, err);
} }
if (env->basal_txn)
env->basal_txn->owner = 0; env->basal_txn->owner = 0;
LeaveCriticalSection(&env->windowsbug_lock); LeaveCriticalSection(&env->windowsbug_lock);
} }