winhttp: Don't wait for the task thread to exit.
Huw Davies
huw at codeweavers.com
Tue Jul 21 09:57:13 CDT 2015
Instead, have the task thread call the destructor before it exits.
Previously, if the task thread held the final reference, it would call
request_destroy which would then wait for itself to finish.
---
dlls/winhttp/request.c | 5 +++++
dlls/winhttp/session.c | 12 ++++++------
2 files changed, 11 insertions(+), 6 deletions(-)
diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c
index aa8a6f9..9a79754 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 109ca3a..2fae530 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 );
--
1.8.0
More information about the wine-patches
mailing list