@@ -115,14 +115,19 @@ WaitLatchOrSocket(volatile Latch *latch, int wakeEvents, pgsocket sock,
115115else
116116timeout = 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+ */
119125latchevent = latch -> event ;
120126
121- events [0 ]= latchevent ;
122- events [1 ]= pgwin32_signal_event ;
127+ events [0 ]= pgwin32_signal_event ;
128+ events [1 ]= latchevent ;
123129numevents = 2 ;
124- if ((wakeEvents & WL_SOCKET_READABLE )||
125- (wakeEvents & WL_SOCKET_WRITEABLE ))
130+ if (wakeEvents & (WL_SOCKET_READABLE |WL_SOCKET_WRITEABLE ))
126131{
127132int flags = 0 ;
128133
@@ -132,7 +137,13 @@ WaitLatchOrSocket(volatile Latch *latch, int wakeEvents, pgsocket sock,
132137flags |=FD_WRITE ;
133138
134139sockevent = 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+
136147events [numevents ++ ]= sockevent ;
137148}
138149if (wakeEvents & WL_POSTMASTER_DEATH )
@@ -141,6 +152,9 @@ WaitLatchOrSocket(volatile Latch *latch, int wakeEvents, pgsocket sock,
141152events [numevents ++ ]= PostmasterHandle ;
142153}
143154
155+ /* Ensure that signals are serviced even if latch is already set */
156+ pgwin32_dispatch_queued_signals ();
157+
144158do
145159{
146160/*
@@ -151,6 +165,7 @@ WaitLatchOrSocket(volatile Latch *latch, int wakeEvents, pgsocket sock,
151165 */
152166if (!ResetEvent (latchevent ))
153167elog (ERROR ,"ResetEvent failed: error code %lu" ,GetLastError ());
168+
154169if ((wakeEvents & WL_LATCH_SET )&& latch -> is_set )
155170{
156171result |=WL_LATCH_SET ;
@@ -164,21 +179,20 @@ WaitLatchOrSocket(volatile Latch *latch, int wakeEvents, pgsocket sock,
164179rc = WaitForMultipleObjects (numevents ,events , FALSE,timeout );
165180
166181if (rc == WAIT_FAILED )
167- elog (ERROR ,"WaitForMultipleObjects() failed: error code %lu" ,GetLastError ());
168-
169- /* Participate in Windows signal emulation */
170- else if (rc == WAIT_OBJECT_0 + 1 )
171- pgwin32_dispatch_queued_signals ();
172-
182+ elog (ERROR ,"WaitForMultipleObjects() failed: error code %lu" ,
183+ GetLastError ());
173184else if (rc == WAIT_TIMEOUT )
174185{
175186result |=WL_TIMEOUT ;
176187}
177- else if ((wakeEvents & WL_POSTMASTER_DEATH )&&
178- rc == WAIT_OBJECT_0 + pmdeath_eventno )
188+ else if (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+ else if (rc == WAIT_OBJECT_0 + 1 )
194+ {
195+ /* Latch is set, we'll handle that on next iteration of loop */
182196}
183197else if ((wakeEvents & (WL_SOCKET_READABLE |WL_SOCKET_WRITEABLE ))&&
184198rc == WAIT_OBJECT_0 + 2 )/* socket is at event slot 2 */
@@ -187,9 +201,8 @@ WaitLatchOrSocket(volatile Latch *latch, int wakeEvents, pgsocket sock,
187201
188202ZeroMemory (& resEvents ,sizeof (resEvents ));
189203if (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 ());
193206if ((wakeEvents & WL_SOCKET_READABLE )&&
194207(resEvents .lNetworkEvents & FD_READ ))
195208{
@@ -201,8 +214,13 @@ WaitLatchOrSocket(volatile Latch *latch, int wakeEvents, pgsocket sock,
201214result |=WL_SOCKET_WRITEABLE ;
202215}
203216}
204- /* Otherwise it must be the latch event */
205- else if (rc != WAIT_OBJECT_0 )
217+ else if ((wakeEvents & WL_POSTMASTER_DEATH )&&
218+ rc == WAIT_OBJECT_0 + pmdeath_eventno )
219+ {
220+ /* Postmaster died */
221+ result |=WL_POSTMASTER_DEATH ;
222+ }
223+ else
206224elog (ERROR ,"unexpected return code from WaitForMultipleObjects(): %lu" ,rc );
207225}
208226while (result == 0 );