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

Alexandre Julliard julliard at winehq.org
Tue Apr 20 16:27:44 CDT 2021


Module: wine
Branch: master
Commit: 6e75cc98e8fde0e1da69622db88c7835e2b0fdbc
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=6e75cc98e8fde0e1da69622db88c7835e2b0fdbc

Author: Paul Gofman <pgofman at codeweavers.com>
Date:   Tue Apr 20 01:22:30 2021 +0300

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

Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/threadpool.c | 38 +++++++++++++++++++-------------------
 1 file changed, 19 insertions(+), 19 deletions(-)

diff --git a/dlls/ntdll/threadpool.c b/dlls/ntdll/threadpool.c
index 1b51a191979..6f03e96780c 100644
--- a/dlls/ntdll/threadpool.c
+++ b/dlls/ntdll/threadpool.c
@@ -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 );
 }
 
 /***********************************************************************




More information about the wine-cvs mailing list