Alexandre Julliard : ws2_32: Set the completion event on the server side also for AcceptEx.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Mar 9 08:43:17 CDT 2015


Module: wine
Branch: master
Commit: 09cd7cf3e05015d1d940025963197bf4cadb3d01
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=09cd7cf3e05015d1d940025963197bf4cadb3d01

Author: Alexandre Julliard <julliard at 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;




More information about the wine-cvs mailing list