Module: wine Branch: master Commit: 09cd7cf3e05015d1d940025963197bf4cadb3d01 URL: http://source.winehq.org/git/wine.git/?a=commit;h=09cd7cf3e05015d1d940025963...
Author: Alexandre Julliard julliard@winehq.org Date: Sat Mar 7 15:17:05 2015 +0900
ws2_32: Set the completion event on the server side also for AcceptEx.
---
dlls/ws2_32/socket.c | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index 760e184..b4ed865 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -2078,8 +2078,6 @@ static NTSTATUS WS2_async_accept_recv( void *user, IO_STATUS_BLOCK *iosb, if (status == STATUS_PENDING) return status;
- if (wsa->user_overlapped->hEvent) - NtSetEvent(wsa->user_overlapped->hEvent, NULL); if (wsa->cvalue) WS_AddCompletion( HANDLE2SOCKET(wsa->listen_socket), wsa->cvalue, iosb->u.Status, iosb->Information );
@@ -2146,6 +2144,7 @@ static NTSTATUS WS2_async_accept( void *user, IO_STATUS_BLOCK *iosb, { req->type = ASYNC_TYPE_READ; req->async.handle = wine_server_obj_handle( wsa->accept_socket ); + req->async.event = wine_server_obj_handle( wsa->user_overlapped->hEvent ); req->async.callback = wine_server_client_ptr( WS2_async_accept_recv ); req->async.iosb = wine_server_client_ptr( iosb ); req->async.arg = wine_server_client_ptr( wsa ); @@ -2164,9 +2163,6 @@ finish: iosb->u.Status = status; iosb->Information = 0;
- if (wsa->user_overlapped->hEvent) - NtSetEvent(wsa->user_overlapped->hEvent, NULL); - if (wsa->read) release_async_io( &wsa->read->io ); release_async_io( &wsa->io ); return status; @@ -2434,7 +2430,6 @@ static BOOL WINAPI WS2_AcceptEx(SOCKET listener, SOCKET acceptor, PVOID dest, DW DWORD status; struct ws2_accept_async *wsa; int fd; - ULONG_PTR cvalue = (overlapped && ((ULONG_PTR)overlapped->hEvent & 1) == 0) ? (ULONG_PTR)overlapped : 0;
TRACE("(%lx, %lx, %p, %d, %d, %d, %p, %p)\n", listener, acceptor, dest, dest_len, local_addr_len, rem_addr_len, received, overlapped); @@ -2483,7 +2478,7 @@ static BOOL WINAPI WS2_AcceptEx(SOCKET listener, SOCKET acceptor, PVOID dest, DW wsa->listen_socket = SOCKET2HANDLE(listener); wsa->accept_socket = SOCKET2HANDLE(acceptor); wsa->user_overlapped = overlapped; - wsa->cvalue = cvalue; + wsa->cvalue = !((ULONG_PTR)overlapped->hEvent & 1) ? (ULONG_PTR)overlapped : 0; wsa->buf = dest; wsa->data_len = dest_len; wsa->local_len = local_addr_len; @@ -2518,11 +2513,11 @@ static BOOL WINAPI WS2_AcceptEx(SOCKET listener, SOCKET acceptor, PVOID dest, DW { req->type = ASYNC_TYPE_READ; req->async.handle = wine_server_obj_handle( SOCKET2HANDLE(listener) ); + req->async.event = wine_server_obj_handle( overlapped->hEvent ); req->async.callback = wine_server_client_ptr( WS2_async_accept ); req->async.iosb = wine_server_client_ptr( overlapped ); req->async.arg = wine_server_client_ptr( wsa ); - req->async.cvalue = cvalue; - /* We don't set event since we may also have to read */ + req->async.cvalue = wsa->cvalue; status = wine_server_call( req ); } SERVER_END_REQ;