From: Damjan Jovanovic Subject: [PATCH] wineserver: avoid spurious FD_WRITE on repeated calls to WSAEventSelect() Message-Id: Date: Fri, 20 Dec 2019 04:16:05 +0200 Repeated calls to WSAEventSelect() with FD_WRITE deliver spurious FD_WRITE events, as the flag isn't held, resulting in us unnecessarily polling the socket for writability, despite the fact FD_WRITE should only be delivered (1) initially on socket creation, and (2) after send[to]() fails with EWOULDBLOCK and buffer space becomes available. This breaks some applications (possibly #10204 and #24946). This patch prevents the spurious FD_WRITE by always holding FD_WRITE in WSAEventSelect()/set_socket_event(). It will be cleared from hmask in enable_socket_event() when a real FD_WRITE needs to be delivered. Signed-off-by: Damjan Jovanovic --- dlls/ws2_32/tests/sock.c | 5 ++--- server/sock.c | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index 60c5dfc63f..fa9d081185 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -3053,9 +3053,8 @@ static void test_WSAEnumNetworkEvents(void) } else { - todo_wine_if (i != 0) /* Remove when fixed */ - ok (net_events.lNetworkEvents == 0, "Test[%d]: expected 0, got %d\n", - i, net_events.lNetworkEvents); + ok (net_events.lNetworkEvents == 0, "Test[%d]: expected 0, got %d\n", + i, net_events.lNetworkEvents); } for (k = 0; k < FD_MAX_EVENTS; k++) { diff --git a/server/sock.c b/server/sock.c index 1a53ce4b09..29542cd01f 100644 --- a/server/sock.c +++ b/server/sock.c @@ -1228,7 +1228,7 @@ DECL_HANDLER(set_socket_event) FILE_WRITE_ATTRIBUTES, &sock_ops))) return; old_event = sock->event; sock->mask = req->mask; - sock->hmask &= ~req->mask; /* re-enable held events */ + sock->hmask &= (FD_WRITE | ~req->mask); /* re-enable held events */ sock->event = NULL; sock->window = req->window; sock->message = req->msg;