ntdll: Release IO thread pool object from ioqueue_thread_proc().

Signed-off-by: Paul Gofman <pgofman@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Paul Gofman 2021-04-20 01:22:30 +03:00 committed by Alexandre Julliard
parent 354d97a6f8
commit 6e75cc98e8
1 changed files with 19 additions and 19 deletions

View File

@ -1519,10 +1519,21 @@ static void CALLBACK ioqueue_thread_proc( void *param )
ERR("NtRemoveIoCompletion failed, status %#x.\n", status);
RtlEnterCriticalSection( &ioqueue.cs );
if (key)
{
io = (struct threadpool_object *)key;
io = (struct threadpool_object *)key;
if (io && io->shutdown)
{
if (iosb.u.Status != STATUS_THREADPOOL_RELEASED_DURING_OPERATION)
{
/* Skip remaining completions until the final one. */
continue;
}
--ioqueue.objcount;
TRACE( "Releasing io %p.\n", io );
tp_object_release( io );
}
else if (io)
{
RtlEnterCriticalSection( &io->pool->cs );
if (!array_reserve((void **)&io->u.io.completions, &io->u.io.completion_max,
@ -1609,18 +1620,6 @@ static NTSTATUS tp_ioqueue_lock( struct threadpool_object *io, HANDLE file )
return status;
}
static void tp_ioqueue_unlock( struct threadpool_object *io )
{
assert( io->type == TP_OBJECT_TYPE_IO );
RtlEnterCriticalSection( &ioqueue.cs );
if (!--ioqueue.objcount)
NtSetIoCompletion( ioqueue.port, 0, 0, STATUS_SUCCESS, 0 );
RtlLeaveCriticalSection( &ioqueue.cs );
}
/***********************************************************************
* tp_threadpool_alloc (internal)
*
@ -2051,8 +2050,6 @@ static void tp_object_prepare_shutdown( struct threadpool_object *object )
tp_timerqueue_unlock( object );
else if (object->type == TP_OBJECT_TYPE_WAIT)
tp_waitqueue_unlock( object );
else if (object->type == TP_OBJECT_TYPE_IO)
tp_ioqueue_unlock( object );
}
/***********************************************************************
@ -2796,9 +2793,12 @@ void WINAPI TpReleaseIoCompletion( TP_IO *io )
TRACE( "%p\n", io );
tp_object_prepare_shutdown( this );
RtlEnterCriticalSection( &ioqueue.cs );
assert( ioqueue.objcount );
this->shutdown = TRUE;
tp_object_release( this );
NtSetIoCompletion( ioqueue.port, (ULONG_PTR)this, 0, STATUS_THREADPOOL_RELEASED_DURING_OPERATION, 1 );
RtlLeaveCriticalSection( &ioqueue.cs );
}
/***********************************************************************