diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c index aa8a6f96cb4..9a797543d53 100644 --- a/dlls/winhttp/request.c +++ b/dlls/winhttp/request.c @@ -217,6 +217,11 @@ static DWORD CALLBACK task_proc( LPVOID param ) } case WAIT_OBJECT_0 + 1: TRACE("exiting\n"); + CloseHandle( request->task_cancel ); + CloseHandle( request->task_wait ); + request->task_cs.DebugInfo->Spare[0] = 0; + DeleteCriticalSection( &request->task_cs ); + request->hdr.vtbl->destroy( &request->hdr ); return 0; default: diff --git a/dlls/winhttp/session.c b/dlls/winhttp/session.c index 109ca3aeaa5..2fae530cfd2 100644 --- a/dlls/winhttp/session.c +++ b/dlls/winhttp/session.c @@ -561,13 +561,13 @@ static void request_destroy( object_header_t *hdr ) if (request->task_thread) { + /* Signal to the task proc to quit. It will call + this again when it does. */ + HANDLE thread = request->task_thread; + request->task_thread = 0; SetEvent( request->task_cancel ); - WaitForSingleObject( request->task_thread, INFINITE ); - CloseHandle( request->task_thread ); - CloseHandle( request->task_cancel ); - CloseHandle( request->task_wait ); - request->task_cs.DebugInfo->Spare[0] = 0; - DeleteCriticalSection( &request->task_cs ); + CloseHandle( thread ); + return; } release_object( &request->connect->hdr );