diff --git a/src/core.c b/src/core.c index 159b58ec..b07eb4c7 100644 --- a/src/core.c +++ b/src/core.c @@ -9131,7 +9131,7 @@ static int txn_renew(MDBX_txn *txn, const unsigned flags) { } #if defined(MDBX_USE_VALGRIND) || defined(__SANITIZE_ADDRESS__) txn_valgrind(env, txn); -#endif +#endif /* MDBX_USE_VALGRIND || __SANITIZE_ADDRESS__ */ txn->mt_owner = tid; return MDBX_SUCCESS; } @@ -9813,8 +9813,10 @@ static int txn_end(MDBX_txn *txn, const unsigned mode) { txn->mt_txnid == slot->mr_txnid.weak && slot->mr_txnid.weak >= env->me_lck->mti_oldest_reader.weak); #if defined(MDBX_USE_VALGRIND) || defined(__SANITIZE_ADDRESS__) + atomic_add32(&env->me_ignore_EDEADLK, 1); txn_valgrind(env, nullptr); -#endif + atomic_sub32(&env->me_ignore_EDEADLK, 1); +#endif /* MDBX_USE_VALGRIND || __SANITIZE_ADDRESS__ */ atomic_store32(&slot->mr_snapshot_pages_used, 0, mo_Relaxed); safe64_reset(&slot->mr_txnid, false); atomic_store32(&env->me_lck->mti_readers_refresh_flag, true, @@ -9843,7 +9845,7 @@ static int txn_end(MDBX_txn *txn, const unsigned mode) { #if defined(MDBX_USE_VALGRIND) || defined(__SANITIZE_ADDRESS__) if (txn == env->me_txn0) txn_valgrind(env, nullptr); -#endif +#endif /* MDBX_USE_VALGRIND || __SANITIZE_ADDRESS__ */ txn->mt_flags = MDBX_TXN_FINISHED; txn->mt_owner = 0; @@ -15292,7 +15294,7 @@ bailout: } else { #if defined(MDBX_USE_VALGRIND) || defined(__SANITIZE_ADDRESS__) txn_valgrind(env, nullptr); -#endif +#endif /* MDBX_USE_VALGRIND || __SANITIZE_ADDRESS__ */ } osal_free(env_pathname.buffer_for_free); return rc; diff --git a/src/internals.h b/src/internals.h index 1664dcd7..3d1fd706 100644 --- a/src/internals.h +++ b/src/internals.h @@ -1482,6 +1482,7 @@ struct MDBX_env { int me_valgrind_handle; #endif #if defined(MDBX_USE_VALGRIND) || defined(__SANITIZE_ADDRESS__) + MDBX_atomic_uint32_t me_ignore_EDEADLK; pgno_t me_poison_edge; #endif /* MDBX_USE_VALGRIND || __SANITIZE_ADDRESS__ */ diff --git a/src/lck-posix.c b/src/lck-posix.c index cb55727e..17c50ddd 100644 --- a/src/lck-posix.c +++ b/src/lck-posix.c @@ -822,6 +822,11 @@ __cold static int mdbx_ipclock_failed(MDBX_env *env, osal_ipclock_t *ipc, #error "FIXME" #endif /* MDBX_LOCKING */ +#if defined(MDBX_USE_VALGRIND) || defined(__SANITIZE_ADDRESS__) + if (rc == EDEADLK && atomic_load32(&env->me_ignore_EDEADLK, mo_Relaxed) > 0) + return rc; +#endif /* MDBX_USE_VALGRIND || __SANITIZE_ADDRESS__ */ + ERROR("mutex (un)lock failed, %s", mdbx_strerror(err)); if (rc != EDEADLK) env->me_flags |= MDBX_FATAL_ERROR;