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