Patch: async-winsock.diff Applies: CVS 2002-01-15 Introduce data structures and basic functions for asynchronous Winsock2 operations. ChangeLog: include/winsock2.h: Fix LPWSAOVERLAPPED declaration. dlls/winsock/socket.c: Add basic data strutures & functions for overlapped IO in Winsock. diff -ruX diffignore CVS/wine/dlls/winsock/socket.c MW/wine/dlls/winsock/socket.c --- CVS/wine/dlls/winsock/socket.c Tue Jan 15 20:17:38 2002 +++ MW/wine/dlls/winsock/socket.c Wed Jan 16 10:19:13 2002 @@ -108,6 +108,72 @@ inet_ntoa(((struct sockaddr_in *)a)->sin_addr), \ ntohs(((struct sockaddr_in *)a)->sin_port)) +/**************************************************************** + * Async IO declarations and operations + ****************************************************************/ + +static DWORD ws2_async_get_status (struct async_private *ovp); +static DWORD ws2_async_get_count (struct async_private *ovp); +static void ws2_async_set_status (struct async_private *ovp, DWORD status); +static void CALLBACK ws2_async_call_completion (ULONG_PTR data); + +static struct async_ops ws2_async_ops = +{ + ws2_async_get_status, + ws2_async_set_status, + ws2_async_get_count, + ws2_async_call_completion +}; + +typedef struct ws2_async +{ + async_private async; + LPWSAOVERLAPPED overlapped; + LPWSAOVERLAPPED user_overlapped; + LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_func; + struct iovec *iovec; + int n_iovecs; + struct WS_sockaddr *addr; + int *addrlen; + DWORD flags; +} ws2_async; + +static DWORD ws2_async_get_status (struct async_private *ovp) +{ + return ((ws2_async*) ovp)->overlapped->Internal; +} + +static VOID ws2_async_set_status (struct async_private *ovp, DWORD status) +{ + ((ws2_async*) ovp)->overlapped->Internal = status; +} + +static DWORD ws2_async_get_count (struct async_private *ovp) +{ + return ((ws2_async*) ovp)->overlapped->InternalHigh; +} + +static void CALLBACK ws2_async_call_completion (ULONG_PTR data) +{ + ws2_async* as = (ws2_async*) data; + + TRACE ("data: %p\n", as); + + if ( as->completion_func ) + as->completion_func ( as->overlapped->Internal, + as->overlapped->InternalHigh, + as->user_overlapped, + as->flags ); + + if ( !as->user_overlapped ) + HeapFree ( GetProcessHeap(), 0, as->overlapped ); + + HeapFree ( GetProcessHeap(), 0, as->iovec ); + HeapFree ( GetProcessHeap(), 0, as ); +} + +/****************************************************************/ + /* ----------------------------------- internal data */ /* ws_... struct conversion flags */ diff -ruX diffignore CVS/wine/include/winsock2.h MW/wine/include/winsock2.h --- CVS/wine/include/winsock2.h Tue Jan 15 17:06:03 2002 +++ MW/wine/include/winsock2.h Wed Jan 16 10:22:06 2002 @@ -204,8 +204,7 @@ #define WSAEVENT HANDLE #define LPWSAEVENT LPHANDLE -#define WSAOVERLAPPED OVERLAPPED -typedef struct _OVERLAPPED* LPWSAOVERLAPPED; +typedef OVERLAPPED WSAOVERLAPPED, *LPWSAOVERLAPPED; #define WSA_IO_PENDING (ERROR_IO_PENDING) #define WSA_IO_INCOMPLETE (ERROR_IO_INCOMPLETE)