Hans Leidekker : winhttp: Use the thread pool for asynchronous hostname resolution.

Alexandre Julliard julliard at winehq.org
Fri Nov 23 14:18:02 CST 2018


Module: wine
Branch: master
Commit: 539f2f15308cfef5edb936948aa1988cb1d3519d
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=539f2f15308cfef5edb936948aa1988cb1d3519d

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Fri Nov 23 11:35:28 2018 +0100

winhttp: Use the thread pool for asynchronous hostname resolution.

Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 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 af1d19d..a1ad046 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)
     {




More information about the wine-cvs mailing list