aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/port/win32_sema.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/src/backend/port/win32_sema.c b/src/backend/port/win32_sema.c
index 8c364dfe88d..6602e47ffc6 100644
--- a/src/backend/port/win32_sema.c
+++ b/src/backend/port/win32_sema.c
@@ -121,8 +121,13 @@ PGSemaphoreLock(PGSemaphore sema, bool interruptOK)
DWORD ret;
HANDLE wh[2];
- wh[0] = *sema;
- wh[1] = pgwin32_signal_event;
+ /*
+ * Note: pgwin32_signal_event should be first to ensure that it will be
+ * reported when multiple events are set. We want to guarantee that
+ * pending signals are serviced.
+ */
+ wh[0] = pgwin32_signal_event;
+ wh[1] = *sema;
/*
* As in other implementations of PGSemaphoreLock, we need to check for
@@ -135,20 +140,19 @@ PGSemaphoreLock(PGSemaphore sema, bool interruptOK)
ImmediateInterruptOK = interruptOK;
CHECK_FOR_INTERRUPTS();
- errno = 0;
ret = WaitForMultipleObjectsEx(2, wh, FALSE, INFINITE, TRUE);
if (ret == WAIT_OBJECT_0)
{
- /* We got it! */
- return;
- }
- else if (ret == WAIT_OBJECT_0 + 1)
- {
/* Signal event is set - we have a signal to deliver */
pgwin32_dispatch_queued_signals();
errno = EINTR;
}
+ else if (ret == WAIT_OBJECT_0 + 1)
+ {
+ /* We got it! */
+ errno = 0;
+ }
else
/* Otherwise we are in trouble */
errno = EIDRM;