From 289f2896d0cc0df2bbdc1b6c288d243854884f96 Mon Sep 17 00:00:00 2001 From: Leonid Yuriev Date: Fri, 21 Feb 2020 19:58:32 +0300 Subject: [PATCH] mdbx-windows: more for Wine. Related to https://github.com/erthink/libmdbx/issues/83. UnlockFile() cold return ERROR_LOCK_VIOLATION when file not locked, instead of ERROR_NOT_LOCKED. Current versions of Wine seem to work correctly. Change-Id: Ibc5bd4352184efc7f88705e7ae04d6656286a96e --- src/elements/lck-windows.c | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/src/elements/lck-windows.c b/src/elements/lck-windows.c index 2d4c7d1a..6a2142ea 100644 --- a/src/elements/lck-windows.c +++ b/src/elements/lck-windows.c @@ -367,22 +367,24 @@ mdbx_resume_threads_after_remap(mdbx_handle_array_t *array) { */ static void lck_unlock(MDBX_env *env) { - int rc; + int err; if (env->me_lfd != INVALID_HANDLE_VALUE) { /* double `unlock` for robustly remove overlapped shared/exclusive locks */ while (funlock(env->me_lfd, LCK_LOWER)) ; - rc = GetLastError(); - assert(rc == ERROR_NOT_LOCKED); - (void)rc; + err = GetLastError(); + assert(err == ERROR_NOT_LOCKED || + (mdbx_RunningUnderWine() && err == ERROR_LOCK_VIOLATION)); + (void)err; SetLastError(ERROR_SUCCESS); while (funlock(env->me_lfd, LCK_UPPER)) ; - rc = GetLastError(); - assert(rc == ERROR_NOT_LOCKED); - (void)rc; + err = GetLastError(); + assert(err == ERROR_NOT_LOCKED || + (mdbx_RunningUnderWine() && err == ERROR_LOCK_VIOLATION)); + (void)err; SetLastError(ERROR_SUCCESS); } @@ -391,23 +393,26 @@ static void lck_unlock(MDBX_env *env) { * releases such locks via deferred queues) */ while (funlock(env->me_lazy_fd, LCK_BODY)) ; - rc = GetLastError(); - assert(rc == ERROR_NOT_LOCKED); - (void)rc; + err = GetLastError(); + assert(err == ERROR_NOT_LOCKED || + (mdbx_RunningUnderWine() && err == ERROR_LOCK_VIOLATION)); + (void)err; SetLastError(ERROR_SUCCESS); while (funlock(env->me_lazy_fd, LCK_META)) ; - rc = GetLastError(); - assert(rc == ERROR_NOT_LOCKED); - (void)rc; + err = GetLastError(); + assert(err == ERROR_NOT_LOCKED || + (mdbx_RunningUnderWine() && err == ERROR_LOCK_VIOLATION)); + (void)err; SetLastError(ERROR_SUCCESS); while (funlock(env->me_lazy_fd, LCK_WHOLE)) ; - rc = GetLastError(); - assert(rc == ERROR_NOT_LOCKED); - (void)rc; + err = GetLastError(); + assert(err == ERROR_NOT_LOCKED || + (mdbx_RunningUnderWine() && err == ERROR_LOCK_VIOLATION)); + (void)err; SetLastError(ERROR_SUCCESS); } }