Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit8ebc908

Browse files
committed
Improve Windows implementation of WaitLatch/WaitLatchOrSocket.
Ensure that signal handlers are serviced before this function returns.This should make the behavior more like Unix. Also, add some moreerror checking, and make some other cosmetic improvements.No back-patch since it's not clear whether this is fixing any live bugthat would affect 9.1. I'm more concerned about 9.2 anyway given ourconsiderable recent expansions in the usage of WaitLatch.
1 parent53216e3 commit8ebc908

File tree

1 file changed

+39
-21
lines changed

1 file changed

+39
-21
lines changed

‎src/backend/port/win32_latch.c

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -115,14 +115,19 @@ WaitLatchOrSocket(volatile Latch *latch, int wakeEvents, pgsocket sock,
115115
else
116116
timeout=INFINITE;
117117

118-
/* Construct an array of event handles for WaitforMultipleObjects() */
118+
/*
119+
* Construct an array of event handles for WaitforMultipleObjects().
120+
*
121+
* Note: pgwin32_signal_event should be first to ensure that it will be
122+
* reported when multiple events are set. We want to guarantee that
123+
* pending signals are serviced.
124+
*/
119125
latchevent=latch->event;
120126

121-
events[0]=latchevent;
122-
events[1]=pgwin32_signal_event;
127+
events[0]=pgwin32_signal_event;
128+
events[1]=latchevent;
123129
numevents=2;
124-
if ((wakeEvents&WL_SOCKET_READABLE)||
125-
(wakeEvents&WL_SOCKET_WRITEABLE))
130+
if (wakeEvents& (WL_SOCKET_READABLE |WL_SOCKET_WRITEABLE))
126131
{
127132
intflags=0;
128133

@@ -132,7 +137,13 @@ WaitLatchOrSocket(volatile Latch *latch, int wakeEvents, pgsocket sock,
132137
flags |=FD_WRITE;
133138

134139
sockevent=WSACreateEvent();
135-
WSAEventSelect(sock,sockevent,flags);
140+
if (sockevent==WSA_INVALID_EVENT)
141+
elog(ERROR,"failed to create event for socket: error code %u",
142+
WSAGetLastError());
143+
if (WSAEventSelect(sock,sockevent,flags)!=0)
144+
elog(ERROR,"failed to set up event for socket: error code %u",
145+
WSAGetLastError());
146+
136147
events[numevents++]=sockevent;
137148
}
138149
if (wakeEvents&WL_POSTMASTER_DEATH)
@@ -141,6 +152,9 @@ WaitLatchOrSocket(volatile Latch *latch, int wakeEvents, pgsocket sock,
141152
events[numevents++]=PostmasterHandle;
142153
}
143154

155+
/* Ensure that signals are serviced even if latch is already set */
156+
pgwin32_dispatch_queued_signals();
157+
144158
do
145159
{
146160
/*
@@ -151,6 +165,7 @@ WaitLatchOrSocket(volatile Latch *latch, int wakeEvents, pgsocket sock,
151165
*/
152166
if (!ResetEvent(latchevent))
153167
elog(ERROR,"ResetEvent failed: error code %lu",GetLastError());
168+
154169
if ((wakeEvents&WL_LATCH_SET)&&latch->is_set)
155170
{
156171
result |=WL_LATCH_SET;
@@ -164,21 +179,20 @@ WaitLatchOrSocket(volatile Latch *latch, int wakeEvents, pgsocket sock,
164179
rc=WaitForMultipleObjects(numevents,events, FALSE,timeout);
165180

166181
if (rc==WAIT_FAILED)
167-
elog(ERROR,"WaitForMultipleObjects() failed: error code %lu",GetLastError());
168-
169-
/* Participate in Windows signal emulation */
170-
elseif (rc==WAIT_OBJECT_0+1)
171-
pgwin32_dispatch_queued_signals();
172-
182+
elog(ERROR,"WaitForMultipleObjects() failed: error code %lu",
183+
GetLastError());
173184
elseif (rc==WAIT_TIMEOUT)
174185
{
175186
result |=WL_TIMEOUT;
176187
}
177-
elseif ((wakeEvents&WL_POSTMASTER_DEATH)&&
178-
rc==WAIT_OBJECT_0+pmdeath_eventno)
188+
elseif (rc==WAIT_OBJECT_0)
179189
{
180-
/* Postmaster died */
181-
result |=WL_POSTMASTER_DEATH;
190+
/* Service newly-arrived signals */
191+
pgwin32_dispatch_queued_signals();
192+
}
193+
elseif (rc==WAIT_OBJECT_0+1)
194+
{
195+
/* Latch is set, we'll handle that on next iteration of loop */
182196
}
183197
elseif ((wakeEvents& (WL_SOCKET_READABLE |WL_SOCKET_WRITEABLE))&&
184198
rc==WAIT_OBJECT_0+2)/* socket is at event slot 2 */
@@ -187,9 +201,8 @@ WaitLatchOrSocket(volatile Latch *latch, int wakeEvents, pgsocket sock,
187201

188202
ZeroMemory(&resEvents,sizeof(resEvents));
189203
if (WSAEnumNetworkEvents(sock,sockevent,&resEvents)==SOCKET_ERROR)
190-
ereport(FATAL,
191-
(errmsg_internal("failed to enumerate network events: error code %lu",GetLastError())));
192-
204+
elog(ERROR,"failed to enumerate network events: error code %lu",
205+
GetLastError());
193206
if ((wakeEvents&WL_SOCKET_READABLE)&&
194207
(resEvents.lNetworkEvents&FD_READ))
195208
{
@@ -201,8 +214,13 @@ WaitLatchOrSocket(volatile Latch *latch, int wakeEvents, pgsocket sock,
201214
result |=WL_SOCKET_WRITEABLE;
202215
}
203216
}
204-
/* Otherwise it must be the latch event */
205-
elseif (rc!=WAIT_OBJECT_0)
217+
elseif ((wakeEvents&WL_POSTMASTER_DEATH)&&
218+
rc==WAIT_OBJECT_0+pmdeath_eventno)
219+
{
220+
/* Postmaster died */
221+
result |=WL_POSTMASTER_DEATH;
222+
}
223+
else
206224
elog(ERROR,"unexpected return code from WaitForMultipleObjects(): %lu",rc);
207225
}
208226
while (result==0);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp