Module: wine Branch: master Commit: e23233d79192309fa258d911cda9a3d8a61b5d85 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e23233d79192309fa258d911cd...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Mar 3 15:30:13 2015 +0900
ws2_32: Add a separate structure for async shutdowns.
Conflicts: dlls/ws2_32/socket.c
---
dlls/ws2_32/socket.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index 55f4865..01e9869 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -335,11 +335,18 @@ struct ws2_async_io struct ws2_async_io *next; };
+struct ws2_async_shutdown +{ + struct ws2_async_io io; + HANDLE hSocket; + IO_STATUS_BLOCK iosb; + int type; +}; + struct ws2_async { struct ws2_async_io io; HANDLE hSocket; - int type; LPWSAOVERLAPPED user_overlapped; LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_func; IO_STATUS_BLOCK local_iosb; @@ -2266,7 +2273,7 @@ static NTSTATUS WS2_async_send(void* user, IO_STATUS_BLOCK* iosb, NTSTATUS statu */ static NTSTATUS WS2_async_shutdown( void* user, PIO_STATUS_BLOCK iosb, NTSTATUS status, void **apc ) { - struct ws2_async *wsa = user; + struct ws2_async_shutdown *wsa = user; int fd, err = 1;
switch (status) @@ -2297,25 +2304,24 @@ static NTSTATUS WS2_async_shutdown( void* user, PIO_STATUS_BLOCK iosb, NTSTATUS */ static int WS2_register_async_shutdown( SOCKET s, int type ) { - struct ws2_async *wsa; + struct ws2_async_shutdown *wsa; NTSTATUS status;
TRACE("s %04lx type %d\n", s, type);
- wsa = HeapAlloc( GetProcessHeap(), 0, FIELD_OFFSET( struct ws2_async, iovec[1] )); + wsa = HeapAlloc( GetProcessHeap(), 0, sizeof(*wsa) ); if ( !wsa ) return WSAEFAULT;
- wsa->hSocket = SOCKET2HANDLE(s); - wsa->type = type; - wsa->completion_func = NULL; + wsa->hSocket = SOCKET2HANDLE(s); + wsa->type = type;
SERVER_START_REQ( register_async ) { req->type = type; req->async.handle = wine_server_obj_handle( wsa->hSocket ); req->async.callback = wine_server_client_ptr( WS2_async_shutdown ); - req->async.iosb = wine_server_client_ptr( &wsa->local_iosb ); + req->async.iosb = wine_server_client_ptr( &wsa->iosb ); req->async.arg = wine_server_client_ptr( wsa ); req->async.cvalue = 0; status = wine_server_call( req );