Skip to content

Commit ceabeea

Browse files
authored
Merge pull request swiftlang#581 from compnerd/zero-read-close
event: handle socket events more precisely
2 parents 35f5c96 + fe3ae8e commit ceabeea

File tree

1 file changed

+5
-5
lines changed

1 file changed

+5
-5
lines changed

src/event/event_windows.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -359,22 +359,22 @@ _dispatch_socket_callback(PTP_CALLBACK_INSTANCE inst, void *context,
359359
DWORD dwBytesAvailable = 1;
360360
if (lNetworkEvents & FD_CLOSE) {
361361
dwBytesAvailable = 0;
362-
// Post to all registered read and write handlers
363-
lNetworkEvents |= FD_READ | FD_WRITE;
364362
} else if (lNetworkEvents & FD_READ) {
365363
ioctlsocket(sock, FIONREAD, &dwBytesAvailable);
366364
}
367-
if (lNetworkEvents & FD_READ) {
365+
if ((lNetworkEvents & FD_CLOSE) ||
366+
((lNetworkEvents & FD_READ) && (dwBytesAvailable > 0))) {
368367
_dispatch_muxnote_retain(dmn);
369368
if (!PostQueuedCompletionStatus(hPort, dwBytesAvailable,
370369
(ULONG_PTR)DISPATCH_PORT_SOCKET_READ, (LPOVERLAPPED)dmn)) {
371370
DISPATCH_INTERNAL_CRASH(GetLastError(),
372371
"PostQueuedCompletionStatus");
373372
}
374373
}
375-
if (lNetworkEvents & FD_WRITE) {
374+
if ((lNetworkEvents & FD_CLOSE) || (lNetworkEvents & FD_WRITE)) {
376375
_dispatch_muxnote_retain(dmn);
377-
if (!PostQueuedCompletionStatus(hPort, dwBytesAvailable,
376+
if (!PostQueuedCompletionStatus(hPort,
377+
lNetworkEvents & FD_CLOSE ? 0 : 1,
378378
(ULONG_PTR)DISPATCH_PORT_SOCKET_WRITE, (LPOVERLAPPED)dmn)) {
379379
DISPATCH_INTERNAL_CRASH(GetLastError(),
380380
"PostQueuedCompletionStatus");

0 commit comments

Comments
 (0)