From: Sebastian Lackner Subject: [3/11] ntdll: Add support for threadpool finalization callback. Message-Id: <55945346.40307@fds-team.de> Date: Wed, 1 Jul 2015 22:53:26 +0200 --- 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