Module: wine Branch: master Commit: fa114f122b066e1b9b0f90d45c5a2ce33be386d5 URL: http://source.winehq.org/git/wine.git/?a=commit;h=fa114f122b066e1b9b0f90d45c...
Author: Sebastian Lackner sebastian@fds-team.de Date: Wed Jul 1 22:53:26 2015 +0200
ntdll: Add support for threadpool finalization callback.
---
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--;