diff options
Diffstat (limited to 'src/backend/port/win32/sema.c')
-rw-r--r-- | src/backend/port/win32/sema.c | 17 |
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; |