mdbx-windows: move the LockFileEx(LOCKFILE_FAIL_IMMEDIATELY) repeats for using in all cases.

This commit is contained in:
Леонид Юрьев (Leonid Yuriev)
2025-09-07 12:14:03 +03:00
parent cd27aa017f
commit 74ef6502e3

View File

@@ -24,6 +24,9 @@ static int flock_with_event(HANDLE fd, HANDLE event, unsigned flags, size_t offs
ov.hEvent = event;
ov.Offset = (DWORD)offset;
ov.OffsetHigh = HIGH_DWORD(offset);
int retry_left = (flags & LOCKFILE_FAIL_IMMEDIATELY) ? 3 : 0;
while (true) {
if (LockFileEx(fd, flags, 0, (DWORD)bytes, HIGH_DWORD(bytes), &ov)) {
TRACE("lock<<: fd %p, event %p, flags 0x%x offset %zu, bytes %zu << %s", fd, event, flags, offset, bytes, "done");
return MDBX_SUCCESS;
@@ -41,9 +44,15 @@ static int flock_with_event(HANDLE fd, HANDLE event, unsigned flags, size_t offs
} else
CancelIo(fd);
}
if (rc != ERROR_LOCK_VIOLATION || --retry_left < 1) {
TRACE("lock<<: fd %p, event %p, flags 0x%x offset %zu, bytes %zu << err %d", fd, event, flags, offset, bytes,
(int)rc);
return (int)rc;
}
SleepEx(0, true);
}
}
static inline int flock(HANDLE fd, unsigned flags, size_t offset, size_t bytes) {
@@ -94,14 +103,6 @@ int lck_txn_lock(MDBX_env *env, bool dontwait) {
const HANDLE fd4data = env->ioring.overlapped_fd ? env->ioring.overlapped_fd : env->lazy_fd;
int rc = flock_with_event(fd4data, env->dxb_lock_event,
dontwait ? (LCK_EXCLUSIVE | LCK_DONTWAIT) : (LCK_EXCLUSIVE | LCK_WAITFOR), DXB_BODY);
if (rc == ERROR_LOCK_VIOLATION && dontwait) {
SleepEx(0, true);
rc = flock_with_event(fd4data, env->dxb_lock_event, LCK_EXCLUSIVE | LCK_DONTWAIT, DXB_BODY);
if (rc == ERROR_LOCK_VIOLATION) {
SleepEx(0, true);
rc = flock_with_event(fd4data, env->dxb_lock_event, LCK_EXCLUSIVE | LCK_DONTWAIT, DXB_BODY);
}
}
if (rc == MDBX_SUCCESS) {
done:
if (env->basal_txn)