Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 2750b11

Browse files
committed
Fix places where WaitForxxx can block, to eliminate failure to detect
deadlock on Win32. Magnus Hagander
1 parent a1f7fb0 commit 2750b11

File tree

2 files changed

+9
-9
lines changed

2 files changed

+9
-9
lines changed

src/backend/port/win32/sema.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* Portions Copyright (c) 1996-2004, PostgreSQL Global Development Group
77
*
88
* IDENTIFICATION
9-
* $PostgreSQL: pgsql/src/backend/port/win32/sema.c,v 1.8 2004/08/29 05:06:46 momjian Exp $
9+
* $PostgreSQL: pgsql/src/backend/port/win32/sema.c,v 1.9 2004/09/07 14:31:42 tgl Exp $
1010
*
1111
*-------------------------------------------------------------------------
1212
*/
@@ -233,15 +233,15 @@ semop(int semId, struct sembuf * sops, int nsops)
233233
wh[0] = cur_handle;
234234
wh[1] = pgwin32_signal_event;
235235

236-
ret = WaitForMultipleObjects(2, wh, FALSE, (sops[0].sem_flg & IPC_NOWAIT) ? 0 : INFINITE);
236+
ret = WaitForMultipleObjectsEx(2, wh, FALSE, (sops[0].sem_flg & IPC_NOWAIT) ? 0 : INFINITE, TRUE);
237237

238238
if (ret == WAIT_OBJECT_0)
239239
{
240240
/* We got it! */
241241
sem_counts[sops[0].sem_num]--;
242242
return 0;
243243
}
244-
else if (ret == WAIT_OBJECT_0 + 1)
244+
else if (ret == WAIT_OBJECT_0 + 1 || ret == WAIT_IO_COMPLETION)
245245
{
246246
/* Signal event is set - we have a signal to deliver */
247247
pgwin32_dispatch_queued_signals();

src/backend/port/win32/socket.c

+6-6
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* Portions Copyright (c) 1996-2004, PostgreSQL Global Development Group
77
*
88
* IDENTIFICATION
9-
* $PostgreSQL: pgsql/src/backend/port/win32/socket.c,v 1.5 2004/08/30 02:54:38 momjian Exp $
9+
* $PostgreSQL: pgsql/src/backend/port/win32/socket.c,v 1.6 2004/09/07 14:31:42 tgl Exp $
1010
*
1111
*-------------------------------------------------------------------------
1212
*/
@@ -93,7 +93,7 @@ TranslateSocketError(void)
9393
static int
9494
pgwin32_poll_signals(void)
9595
{
96-
if (WaitForSingleObject(pgwin32_signal_event, 0) == WAIT_OBJECT_0)
96+
if (WaitForSingleObjectEx(pgwin32_signal_event, 0, TRUE) == WAIT_OBJECT_0)
9797
{
9898
pgwin32_dispatch_queued_signals();
9999
errno = EINTR;
@@ -130,9 +130,9 @@ pgwin32_waitforsinglesocket(SOCKET s, int what)
130130

131131
events[0] = pgwin32_signal_event;
132132
events[1] = waitevent;
133-
r = WaitForMultipleObjects(2, events, FALSE, INFINITE);
133+
r = WaitForMultipleObjectsEx(2, events, FALSE, INFINITE, TRUE);
134134

135-
if (r == WAIT_OBJECT_0)
135+
if (r == WAIT_OBJECT_0 || r == WAIT_IO_COMPLETION)
136136
{
137137
pgwin32_dispatch_queued_signals();
138138
errno = EINTR;
@@ -419,8 +419,8 @@ pgwin32_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, c
419419
}
420420

421421
events[numevents] = pgwin32_signal_event;
422-
r = WaitForMultipleObjectsEx(numevents + 1, events, FALSE, timeoutval, FALSE);
423-
if (r != WSA_WAIT_TIMEOUT && r != (WAIT_OBJECT_0 + numevents))
422+
r = WaitForMultipleObjectsEx(numevents + 1, events, FALSE, timeoutval, TRUE);
423+
if (r != WAIT_TIMEOUT && r != WAIT_IO_COMPLETION && r != (WAIT_OBJECT_0 + numevents))
424424
{
425425
/*
426426
* We scan all events, even those not signalled, in case more than

0 commit comments

Comments
 (0)