winhttp: Don't wait for the task thread to exit.

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.
This commit is contained in:
Huw Davies 2015-07-21 15:57:13 +01:00 committed by Alexandre Julliard
parent 65319e811b
commit 50d9d187c5
2 changed files with 11 additions and 6 deletions

View File

@ -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:

View File

@ -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 );