Commit eb39cb13 authored by Sebastian Lackner's avatar Sebastian Lackner Committed by Alexandre Julliard

ntdll: Implement TpCallbackReleaseSemaphoreOnCompletion.

parent 02ee5bb5
...@@ -976,6 +976,7 @@ ...@@ -976,6 +976,7 @@
@ stdcall TpCallbackLeaveCriticalSectionOnCompletion(ptr ptr) @ stdcall TpCallbackLeaveCriticalSectionOnCompletion(ptr ptr)
@ stdcall TpCallbackMayRunLong(ptr) @ stdcall TpCallbackMayRunLong(ptr)
@ stdcall TpCallbackReleaseMutexOnCompletion(ptr long) @ stdcall TpCallbackReleaseMutexOnCompletion(ptr long)
@ stdcall TpCallbackReleaseSemaphoreOnCompletion(ptr long long)
@ stdcall TpPostWork(ptr) @ stdcall TpPostWork(ptr)
@ stdcall TpReleaseCleanupGroup(ptr) @ stdcall TpReleaseCleanupGroup(ptr)
@ stdcall TpReleaseCleanupGroupMembers(ptr long ptr) @ stdcall TpReleaseCleanupGroupMembers(ptr long ptr)
......
...@@ -207,6 +207,8 @@ struct threadpool_instance ...@@ -207,6 +207,8 @@ struct threadpool_instance
{ {
CRITICAL_SECTION *critical_section; CRITICAL_SECTION *critical_section;
HANDLE mutex; HANDLE mutex;
HANDLE semaphore;
LONG semaphore_count;
} cleanup; } cleanup;
}; };
...@@ -1608,6 +1610,7 @@ static void CALLBACK threadpool_worker_proc( void *param ) ...@@ -1608,6 +1610,7 @@ static void CALLBACK threadpool_worker_proc( void *param )
struct threadpool *pool = param; struct threadpool *pool = param;
LARGE_INTEGER timeout; LARGE_INTEGER timeout;
struct list *ptr; struct list *ptr;
NTSTATUS status;
TRACE( "starting worker thread for pool %p\n", pool ); TRACE( "starting worker thread for pool %p\n", pool );
...@@ -1637,6 +1640,8 @@ static void CALLBACK threadpool_worker_proc( void *param ) ...@@ -1637,6 +1640,8 @@ static void CALLBACK threadpool_worker_proc( void *param )
instance.may_run_long = object->may_run_long; instance.may_run_long = object->may_run_long;
instance.cleanup.critical_section = NULL; instance.cleanup.critical_section = NULL;
instance.cleanup.mutex = NULL; instance.cleanup.mutex = NULL;
instance.cleanup.semaphore = NULL;
instance.cleanup.semaphore_count = 0;
switch (object->type) switch (object->type)
{ {
...@@ -1679,9 +1684,15 @@ static void CALLBACK threadpool_worker_proc( void *param ) ...@@ -1679,9 +1684,15 @@ static void CALLBACK threadpool_worker_proc( void *param )
} }
if (instance.cleanup.mutex) if (instance.cleanup.mutex)
{ {
NtReleaseMutant( instance.cleanup.mutex, NULL ); status = NtReleaseMutant( instance.cleanup.mutex, NULL );
if (status != STATUS_SUCCESS) goto skip_cleanup;
}
if (instance.cleanup.semaphore)
{
NtReleaseSemaphore( instance.cleanup.semaphore, instance.cleanup.semaphore_count, NULL );
} }
skip_cleanup:
RtlEnterCriticalSection( &pool->cs ); RtlEnterCriticalSection( &pool->cs );
pool->num_busy_workers--; pool->num_busy_workers--;
object->num_running_callbacks--; object->num_running_callbacks--;
...@@ -1846,6 +1857,22 @@ VOID WINAPI TpCallbackReleaseMutexOnCompletion( TP_CALLBACK_INSTANCE *instance, ...@@ -1846,6 +1857,22 @@ VOID WINAPI TpCallbackReleaseMutexOnCompletion( TP_CALLBACK_INSTANCE *instance,
} }
/*********************************************************************** /***********************************************************************
* TpCallbackReleaseSemaphoreOnCompletion (NTDLL.@)
*/
VOID WINAPI TpCallbackReleaseSemaphoreOnCompletion( TP_CALLBACK_INSTANCE *instance, HANDLE semaphore, DWORD count )
{
struct threadpool_instance *this = impl_from_TP_CALLBACK_INSTANCE( instance );
TRACE( "%p %p %u\n", instance, semaphore, count );
if (!this->cleanup.semaphore)
{
this->cleanup.semaphore = semaphore;
this->cleanup.semaphore_count = count;
}
}
/***********************************************************************
* TpPostWork (NTDLL.@) * TpPostWork (NTDLL.@)
*/ */
VOID WINAPI TpPostWork( TP_WORK *work ) VOID WINAPI TpPostWork( TP_WORK *work )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment