Jacek Caban : ws2_32: Use register_async for WS2_async_recv.

Alexandre Julliard julliard at winehq.org
Wed Apr 5 16:17:08 CDT 2017


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Apr  5 13:38:03 2017 +0200

ws2_32: Use register_async for WS2_async_recv.

This changes behaviour in case when winsock attempts to use both
completion routine and completion value. Tests from previous patch show
that it should fail anyway. It will be possible to properly return error
once APCs are passed to server in register_async request.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ws2_32/socket.c | 18 ++++++------------
 1 file changed, 6 insertions(+), 12 deletions(-)

diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index 702d281..2a957ce 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -7792,18 +7792,12 @@ static int WS2_recv_base( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount,
                 iosb->u.Status = STATUS_PENDING;
                 iosb->Information = 0;
 
-                SERVER_START_REQ( register_async )
-                {
-                    req->type           = ASYNC_TYPE_READ;
-                    req->async.handle   = wine_server_obj_handle( wsa->hSocket );
-                    req->async.callback = wine_server_client_ptr( WS2_async_recv );
-                    req->async.iosb     = wine_server_client_ptr( iosb );
-                    req->async.arg      = wine_server_client_ptr( wsa );
-                    req->async.event    = wine_server_obj_handle( lpCompletionRoutine ? 0 : lpOverlapped->hEvent );
-                    req->async.cvalue   = cvalue;
-                    err = wine_server_call( req );
-                }
-                SERVER_END_REQ;
+                if (wsa->completion_func)
+                    err = register_async( ASYNC_TYPE_READ, wsa->hSocket, WS2_async_recv, wsa, NULL,
+                                          ws2_async_apc, wsa, iosb );
+                else
+                    err = register_async( ASYNC_TYPE_READ, wsa->hSocket, WS2_async_recv, wsa, lpOverlapped->hEvent,
+                                          NULL, (void *)cvalue, iosb );
 
                 if (err != STATUS_PENDING) HeapFree( GetProcessHeap(), 0, wsa );
                 SetLastError(NtStatusToWSAError( err ));




More information about the wine-cvs mailing list