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