From 230fbd64f5c27236399a4310cbd0f6455e448c6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9B=D0=B5=D0=BE=D0=BD=D0=B8=D0=B4=20=D0=AE=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=20=28Leonid=20Yuriev=29?= Date: Wed, 16 Jul 2025 23:17:38 +0300 Subject: [PATCH] =?UTF-8?q?mdbx:=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5/=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B8=D1=85=20ass?= =?UTF-8?q?ert-=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BE=D0=BA=20(backpor?= =?UTF-8?q?t,=20squashed).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gc-get.c | 4 +--- src/lck-posix.c | 5 +---- src/lck-windows.c | 10 ++++++---- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/gc-get.c b/src/gc-get.c index bb1c9680..dcbd30ce 100644 --- a/src/gc-get.c +++ b/src/gc-get.c @@ -872,10 +872,8 @@ pgr_t gc_alloc_ex(const MDBX_cursor *const mc, const size_t num, uint8_t flags) //--------------------------------------------------------------------------- - if (unlikely(!is_gc_usable(txn, mc, flags))) { - eASSERT(env, (txn->flags & txn_gc_drained) || num > 1); + if (unlikely(!is_gc_usable(txn, mc, flags))) goto no_gc; - } eASSERT(env, (flags & (ALLOC_COALESCE | ALLOC_LIFO | ALLOC_SHOULD_SCAN)) == 0); flags += (env->flags & MDBX_LIFORECLAIM) ? ALLOC_LIFO : 0; diff --git a/src/lck-posix.c b/src/lck-posix.c index 949dd905..6e1919fc 100644 --- a/src/lck-posix.c +++ b/src/lck-posix.c @@ -824,7 +824,6 @@ MDBX_INTERNAL void lck_rdt_unlock(MDBX_env *env) { int lck_txn_lock(MDBX_env *env, bool dont_wait) { TRACE("%swait %s", dont_wait ? "dont-" : "", ">>"); - eASSERT(env, env->basal_txn || (env->lck == lckless_stub(env) && (env->flags & MDBX_RDONLY))); jitter4testing(true); const int err = osal_ipclock_lock(env, &env->lck->wrt_lock, dont_wait); int rc = err; @@ -842,10 +841,8 @@ int lck_txn_lock(MDBX_env *env, bool dont_wait) { void lck_txn_unlock(MDBX_env *env) { TRACE("%s", ">>"); 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; - } else { - eASSERT(env, env->lck == lckless_stub(env) && (env->flags & MDBX_RDONLY)); } int err = osal_ipclock_unlock(env, &env->lck->wrt_lock); TRACE("<< err %d", err); diff --git a/src/lck-windows.c b/src/lck-windows.c index 296679d1..c5f36e97 100644 --- a/src/lck-windows.c +++ b/src/lck-windows.c @@ -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) goto done; @@ -104,10 +104,11 @@ int lck_txn_lock(MDBX_env *env, bool dontwait) { } if (rc == MDBX_SUCCESS) { done: + if (env->basal_txn) + env->basal_txn->owner = osal_thread_self(); /* Zap: Failing to release lock 'env->windowsbug_lock' * in function 'mdbx_txn_lock' */ MDBX_SUPPRESS_GOOFY_MSVC_ANALYZER(26115); - env->basal_txn->owner = osal_thread_self(); return MDBX_SUCCESS; } @@ -116,14 +117,15 @@ int lck_txn_lock(MDBX_env *env, bool dontwait) { } 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) { const HANDLE fd4data = env->ioring.overlapped_fd ? env->ioring.overlapped_fd : env->lazy_fd; int err = funlock(fd4data, DXB_BODY); if (err != MDBX_SUCCESS) mdbx_panic("%s failed: err %u", __func__, err); } - env->basal_txn->owner = 0; + if (env->basal_txn) + env->basal_txn->owner = 0; LeaveCriticalSection(&env->windowsbug_lock); }