[3/11] ntdll: Add support for threadpool finalization callback.

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


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

diff --git a/dlls/ntdll/threadpool.c b/dlls/ntdll/threadpool.c
index 93d9b28..0133e66 100644
--- a/dlls/ntdll/threadpool.c
+++ b/dlls/ntdll/threadpool.c
@@ -172,6 +172,7 @@ struct threadpool_object
     struct threadpool_group *group;
     PVOID                   userdata;
     PTP_CLEANUP_GROUP_CANCEL_CALLBACK group_cancel_callback;
+    PTP_SIMPLE_CALLBACK     finalization_callback;
     /* information about the group, locked via .group->cs */
     struct list             group_entry;
     BOOL                    is_group_member;
@@ -1372,6 +1373,7 @@ static void tp_object_initialize( struct threadpool_object *object, struct threa
     object->group                   = NULL;
     object->userdata                = userdata;
     object->group_cancel_callback   = NULL;
+    object->finalization_callback   = NULL;
 
     memset( &object->group_entry, 0, sizeof(object->group_entry) );
     object->is_group_member         = FALSE;
@@ -1388,6 +1390,7 @@ static void tp_object_initialize( struct threadpool_object *object, struct threa
 
         object->group = impl_from_TP_CLEANUP_GROUP( environment->CleanupGroup );
         object->group_cancel_callback   = environment->CleanupGroupCancelCallback;
+        object->finalization_callback   = environment->FinalizationCallback;
 
         WARN( "environment not fully implemented yet\n" );
     }
@@ -1616,6 +1619,15 @@ static void CALLBACK threadpool_worker_proc( void *param )
                     break;
             }
 
+            /* Execute finalization callback. */
+            if (object->finalization_callback)
+            {
+                TRACE( "executing finalization callback %p(NULL, %p)\n",
+                       object->finalization_callback, object->userdata );
+                object->finalization_callback( NULL, object->userdata );
+                TRACE( "callback %p returned\n", object->finalization_callback );
+            }
+
             RtlEnterCriticalSection( &pool->cs );
             pool->num_busy_workers--;
             object->num_running_callbacks--;
-- 
2.4.4



More information about the wine-patches mailing list