From 0604accecf43ef696d5b7c7dbd2cca00304c14b7 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: Tue, 4 Mar 2025 10:44:42 +0300 Subject: [PATCH] =?UTF-8?q?mdbx:=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B2=D0=BB=D0=B0=D0=B4=D0=B5=D0=BB=D1=8C=D1=86?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=BE=D1=82=D0=BE=D0=BA=D0=B0=20=D0=B2=D0=BB?= =?UTF-8?q?=D0=B0=D0=B4=D0=B5=D1=8E=D1=89=D0=B5=D0=B3=D0=BE=20=D1=82=D1=80?= =?UTF-8?q?=D0=B0=D0=BD=D0=B7=D0=B0=D0=BA=D1=86=D0=B8=D0=B5=D0=B9=20=D1=82?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D0=BF=D1=80=D0=B8=20`MDBX=5FT?= =?UTF-8?q?XN=5FCHECKOWNER=3DON`=20(backport).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api-env.c | 2 +- src/api-extra.c | 3 ++- src/api-txn.c | 4 ++++ test/extra/txn.c++ | 2 ++ 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/api-env.c b/src/api-env.c index 2bfbdeb2..bd3702e9 100644 --- a/src/api-env.c +++ b/src/api-env.c @@ -648,7 +648,7 @@ __cold int mdbx_env_close_ex(MDBX_env *env, bool dont_sync) { #endif /* Windows */ } - if (env->basal_txn && env->basal_txn->owner == osal_thread_self()) + if (env->basal_txn && (MDBX_TXN_CHECKOWNER ? env->basal_txn->owner == osal_thread_self() : !!env->basal_txn->owner)) lck_txn_unlock(env); eASSERT(env, env->signature.weak == 0); diff --git a/src/api-extra.c b/src/api-extra.c index 61b0fac9..32ad4bfd 100644 --- a/src/api-extra.c +++ b/src/api-extra.c @@ -117,7 +117,6 @@ __cold int mdbx_thread_unregister(const MDBX_env *env) { return MDBX_RESULT_TRUE /* not registered */; eASSERT(env, r->pid.weak == env->pid); - eASSERT(env, r->tid.weak == osal_thread_self()); if (unlikely(r->pid.weak != env->pid || r->tid.weak != osal_thread_self())) return LOG_IFERR(MDBX_BAD_RSLOT); @@ -154,8 +153,10 @@ int mdbx_txn_unlock(MDBX_env *env) { if (unlikely(env->flags & MDBX_RDONLY)) return LOG_IFERR(MDBX_EACCESS); +#if MDBX_TXN_CHECKOWNER if (unlikely(env->basal_txn->owner != osal_thread_self())) return LOG_IFERR(MDBX_THREAD_MISMATCH); +#endif /* MDBX_TXN_CHECKOWNER */ if (unlikely((env->basal_txn->flags & MDBX_TXN_FINISHED) == 0)) return LOG_IFERR(MDBX_BUSY); diff --git a/src/api-txn.c b/src/api-txn.c index 1f24c930..2fe01a4e 100644 --- a/src/api-txn.c +++ b/src/api-txn.c @@ -101,11 +101,13 @@ int mdbx_txn_abort(MDBX_txn *txn) { if (unlikely(rc != MDBX_SUCCESS)) return LOG_IFERR(rc); +#if MDBX_TXN_CHECKOWNER if ((txn->flags & (MDBX_TXN_RDONLY | MDBX_NOSTICKYTHREADS)) == MDBX_NOSTICKYTHREADS && unlikely(txn->owner != osal_thread_self())) { mdbx_txn_break(txn); return LOG_IFERR(MDBX_THREAD_MISMATCH); } +#endif /* MDBX_TXN_CHECKOWNER */ return LOG_IFERR(txn_abort(txn)); } @@ -420,11 +422,13 @@ int mdbx_txn_commit_ex(MDBX_txn *txn, MDBX_commit_latency *latency) { goto done; } +#if MDBX_TXN_CHECKOWNER if (!txn->parent && (txn->flags & MDBX_NOSTICKYTHREADS) && unlikely(txn->owner != osal_thread_self())) { txn->flags |= MDBX_TXN_ERROR; rc = MDBX_THREAD_MISMATCH; return LOG_IFERR(rc); } +#endif /* MDBX_TXN_CHECKOWNER */ if (unlikely(txn->flags & MDBX_TXN_ERROR)) { rc = MDBX_RESULT_TRUE; diff --git a/test/extra/txn.c++ b/test/extra/txn.c++ index d817cc7e..3a616015 100644 --- a/test/extra/txn.c++ +++ b/test/extra/txn.c++ @@ -131,6 +131,7 @@ int main(int argc, const char *argv[]) { std::thread t([&]() { s.wait(); +#if MDBX_TXN_CHECKOWNER err = mdbx_txn_reset(c_txn); assert(err == MDBX_THREAD_MISMATCH); ok = ok && err == MDBX_THREAD_MISMATCH; @@ -143,6 +144,7 @@ int main(int argc, const char *argv[]) { err = mdbx_txn_abort(c_txn); assert(err == MDBX_THREAD_MISMATCH); ok = ok && err == MDBX_THREAD_MISMATCH; +#endif /* MDBX_TXN_CHECKOWNER */ err = mdbx_txn_begin(env, txn, MDBX_TXN_READWRITE, &c_txn); assert(err == MDBX_BAD_TXN); ok = ok && err == MDBX_BAD_TXN;