Signed-off-by: Hans Leidekker hans@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) {
Hi Hans,
On 11/23/18 11:35 AM, Hans Leidekker wrote:
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 ))
The patch looks good to me, but note that we could consider just using GetAddrInfoEx instead (although it doesn't support timeout yet).
Jacek