[PATCH 3/6] winhttp: Use the thread pool for asynchronous hostname resolution.

Hans Leidekker hans at codeweavers.com
Fri Nov 23 04:35:28 CST 2018


Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
 dlls/winhttp/net.c | 46 ++++++++++++++++++++++++----------------------
 1 file changed, 24 insertions(+), 22 deletions(-)

diff --git a/dlls/winhttp/net.c b/dlls/winhttp/net.c
index af1d19d212..a1ad0461d4 100644
--- a/dlls/winhttp/net.c
+++ b/dlls/winhttp/net.c
@@ -651,42 +651,44 @@ static DWORD resolve_hostname( const WCHAR *name, INTERNET_PORT port, struct soc
     return ERROR_SUCCESS;
 }
 
-struct resolve_args
+struct async_resolve
 {
     const WCHAR             *hostname;
     INTERNET_PORT            port;
-    struct sockaddr_storage *sa;
+    struct sockaddr_storage *addr;
+    DWORD                    result;
+    HANDLE                   done;
 };
 
-static DWORD CALLBACK resolve_proc( LPVOID arg )
+static void CALLBACK resolve_proc( TP_CALLBACK_INSTANCE *instance, void *ctx )
 {
-    struct resolve_args *ra = arg;
-    return resolve_hostname( ra->hostname, ra->port, ra->sa );
+    struct async_resolve *async = ctx;
+    async->result = resolve_hostname( async->hostname, async->port, async->addr );
+    SetEvent( async->done );
 }
 
-BOOL netconn_resolve( WCHAR *hostname, INTERNET_PORT port, struct sockaddr_storage *sa, int timeout )
+BOOL netconn_resolve( WCHAR *hostname, INTERNET_PORT port, struct sockaddr_storage *addr, int timeout )
 {
     DWORD ret;
 
-    if (timeout)
+    if (!timeout) ret = resolve_hostname( hostname, port, addr );
+    else
     {
-        DWORD status;
-        HANDLE thread;
-        struct resolve_args ra;
-
-        ra.hostname = hostname;
-        ra.port     = port;
-        ra.sa       = sa;
-
-        thread = CreateThread( NULL, 0, resolve_proc, &ra, 0, NULL );
-        if (!thread) return FALSE;
+        struct async_resolve async;
 
-        status = WaitForSingleObject( thread, timeout );
-        if (status == WAIT_OBJECT_0) GetExitCodeThread( thread, &ret );
-        else ret = ERROR_WINHTTP_TIMEOUT;
-        CloseHandle( thread );
+        async.hostname = hostname;
+        async.port     = port;
+        async.addr     = addr;
+        if (!(async.done = CreateEventW( NULL, FALSE, FALSE, NULL ))) return FALSE;
+        if (!TrySubmitThreadpoolCallback( resolve_proc, &async, NULL ))
+        {
+            CloseHandle( async.done );
+            return FALSE;
+        }
+        if (WaitForSingleObject( async.done, timeout ) != WAIT_OBJECT_0) ret = ERROR_WINHTTP_TIMEOUT;
+        else ret = async.result;
+        CloseHandle( async.done );
     }
-    else ret = resolve_hostname( hostname, port, sa );
 
     if (ret)
     {
-- 
2.11.0




More information about the wine-devel mailing list