mdbx-windows: handling EXCEPTION_POSSIBLE_DEADLOCK.

Change-Id: If42c7833e9c4e02fef25634e69c0bd2e926686c1
This commit is contained in:
Leonid Yuriev 2020-11-25 10:49:39 +03:00
parent 092ab094c4
commit 2dab009e76
6 changed files with 23 additions and 2 deletions

View File

@ -447,6 +447,7 @@ EWOULDBLOCK
Exa
exactkey
exactp
excpt
exe
exename
exherbo

View File

@ -58,6 +58,7 @@ Fixes:
- Fixed large pages checking (for compatibility and to avoid false-positive errors from `mdbx_chk`).
- Added workaround for Wine (https://github.com/miranda-ng/miranda-ng/issues/1209).
- Fixed `ERROR_NOT_SUPPORTED` while opening DB by UNC pathnames (https://github.com/miranda-ng/miranda-ng/issues/2627).
- Added handling `EXCEPTION_POSSIBLE_DEADLOCK` condition for Windows.
## v0.9.1 2020-09-30

View File

@ -144,7 +144,15 @@ int mdbx_txn_lock(MDBX_env *env, bool dontwait) {
if (!TryEnterCriticalSection(&env->me_windowsbug_lock))
return MDBX_BUSY;
} else {
EnterCriticalSection(&env->me_windowsbug_lock);
__try {
EnterCriticalSection(&env->me_windowsbug_lock);
}
__except ((GetExceptionCode() ==
0xC0000194 /* STATUS_POSSIBLE_DEADLOCK / EXCEPTION_POSSIBLE_DEADLOCK */)
? EXCEPTION_EXECUTE_HANDLER
: EXCEPTION_CONTINUE_SEARCH) {
return ERROR_POSSIBLE_DEADLOCK;
}
}
if ((env->me_flags & MDBX_EXCLUSIVE) ||

View File

@ -1242,3 +1242,5 @@ wcsstr
wcstol
wcstombs
wcstoul
__C_specific_handler
_except_handler4_common

View File

@ -492,7 +492,15 @@ MDBX_INTERNAL_FUNC int mdbx_fastmutex_destroy(mdbx_fastmutex_t *fastmutex) {
MDBX_INTERNAL_FUNC int mdbx_fastmutex_acquire(mdbx_fastmutex_t *fastmutex) {
#if defined(_WIN32) || defined(_WIN64)
EnterCriticalSection(fastmutex);
__try {
EnterCriticalSection(fastmutex);
} __except (
(GetExceptionCode() ==
0xC0000194 /* STATUS_POSSIBLE_DEADLOCK / EXCEPTION_POSSIBLE_DEADLOCK */)
? EXCEPTION_EXECUTE_HANDLER
: EXCEPTION_CONTINUE_SEARCH) {
return ERROR_POSSIBLE_DEADLOCK;
}
return MDBX_SUCCESS;
#else
return pthread_mutex_lock(fastmutex);

View File

@ -146,6 +146,7 @@ __extern_C key_t ftok(const char *, int);
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <excpt.h>
#include <tlhelp32.h>
#include <windows.h>
#include <winnt.h>