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); }