[10/11] ntdll: Implement TpCallbackSetEventOnCompletion.

Sebastian Lackner sebastian at fds-team.de
Wed Jul 1 15:57:53 CDT 2015


---
 dlls/ntdll/ntdll.spec   |    1 +
 dlls/ntdll/threadpool.c |   22 +++++++++++++++++++++-
 2 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index 8d89c58..03f3af2 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -977,6 +977,7 @@
 @ stdcall TpCallbackMayRunLong(ptr)
 @ stdcall TpCallbackReleaseMutexOnCompletion(ptr long)
 @ stdcall TpCallbackReleaseSemaphoreOnCompletion(ptr long long)
+@ stdcall TpCallbackSetEventOnCompletion(ptr long)
 @ stdcall TpPostWork(ptr)
 @ stdcall TpReleaseCleanupGroup(ptr)
 @ stdcall TpReleaseCleanupGroupMembers(ptr long ptr)
diff --git a/dlls/ntdll/threadpool.c b/dlls/ntdll/threadpool.c
index 46ed810..af4f620 100644
--- a/dlls/ntdll/threadpool.c
+++ b/dlls/ntdll/threadpool.c
@@ -209,6 +209,7 @@ struct threadpool_instance
         HANDLE              mutex;
         HANDLE              semaphore;
         LONG                semaphore_count;
+        HANDLE              event;
     } cleanup;
 };
 
@@ -1642,6 +1643,7 @@ static void CALLBACK threadpool_worker_proc( void *param )
             instance.cleanup.mutex              = NULL;
             instance.cleanup.semaphore          = NULL;
             instance.cleanup.semaphore_count    = 0;
+            instance.cleanup.event              = NULL;
 
             switch (object->type)
             {
@@ -1689,7 +1691,12 @@ static void CALLBACK threadpool_worker_proc( void *param )
             }
             if (instance.cleanup.semaphore)
             {
-                NtReleaseSemaphore( instance.cleanup.semaphore, instance.cleanup.semaphore_count, NULL );
+                status = NtReleaseSemaphore( instance.cleanup.semaphore, instance.cleanup.semaphore_count, NULL );
+                if (status != STATUS_SUCCESS) goto skip_cleanup;
+            }
+            if (instance.cleanup.event)
+            {
+                NtSetEvent( instance.cleanup.event, NULL );
             }
 
         skip_cleanup:
@@ -1873,6 +1880,19 @@ VOID WINAPI TpCallbackReleaseSemaphoreOnCompletion( TP_CALLBACK_INSTANCE *instan
 }
 
 /***********************************************************************
+ *           TpCallbackSetEventOnCompletion    (NTDLL.@)
+ */
+VOID WINAPI TpCallbackSetEventOnCompletion( TP_CALLBACK_INSTANCE *instance, HANDLE event )
+{
+    struct threadpool_instance *this = impl_from_TP_CALLBACK_INSTANCE( instance );
+
+    TRACE( "%p %p\n", instance, event );
+
+    if (!this->cleanup.event)
+        this->cleanup.event = event;
+}
+
+/***********************************************************************
  *           TpPostWork    (NTDLL.@)
  */
 VOID WINAPI TpPostWork( TP_WORK *work )
-- 
2.4.4



More information about the wine-patches mailing list