Module: wine Branch: master Commit: 15110b1770e61593a69a726a6a0238a895fd2b86 URL: http://source.winehq.org/git/wine.git/?a=commit;h=15110b1770e61593a69a726a6a...
Author: Sebastian Lackner sebastian@fds-team.de Date: Wed Jul 1 22:57:53 2015 +0200
ntdll: Implement TpCallbackSetEventOnCompletion.
---
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 )