aboutsummaryrefslogtreecommitdiff
path: root/src/backend/port/win32/sema.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/port/win32/sema.c')
-rw-r--r--src/backend/port/win32/sema.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/src/backend/port/win32/sema.c b/src/backend/port/win32/sema.c
index cee91d62c7e..3a2fb61030b 100644
--- a/src/backend/port/win32/sema.c
+++ b/src/backend/port/win32/sema.c
@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/port/win32/sema.c,v 1.5 2004/02/12 20:37:34 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/port/win32/sema.c,v 1.6 2004/04/12 16:19:18 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -228,11 +228,12 @@ semop(int semId, struct sembuf * sops, int nsops)
if (sops[0].sem_op == -1)
{
DWORD ret;
+ HANDLE wh[2];
- if (sops[0].sem_flg & IPC_NOWAIT)
- ret = WaitForSingleObject(cur_handle, 0);
- else
- ret = WaitForSingleObject(cur_handle, INFINITE);
+ wh[0] = cur_handle;
+ wh[1] = pgwin32_signal_event;
+
+ ret = WaitForMultipleObjects(2, wh, FALSE, (sops[0].sem_flg & IPC_NOWAIT)?0:INFINITE);
if (ret == WAIT_OBJECT_0)
{
@@ -240,6 +241,12 @@ semop(int semId, struct sembuf * sops, int nsops)
sem_counts[sops[0].sem_num]--;
return 0;
}
+ 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_TIMEOUT)
/* Couldn't get it */
errno = EAGAIN;