diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index f0234438daf..94194d6eb17 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -973,6 +973,7 @@ @ stdcall TpAllocPool(ptr ptr) @ stdcall TpReleasePool(ptr) @ stdcall TpSetPoolMaxThreads(ptr long) +@ stdcall TpSetPoolMinThreads(ptr long) @ stdcall TpSimpleTryPost(ptr ptr ptr) @ stdcall -ret64 VerSetConditionMask(int64 long long) @ stdcall WinSqmIsOptedIn() diff --git a/dlls/ntdll/threadpool.c b/dlls/ntdll/threadpool.c index 19f288a5c21..602563355fc 100644 --- a/dlls/ntdll/threadpool.c +++ b/dlls/ntdll/threadpool.c @@ -1480,6 +1480,41 @@ VOID WINAPI TpSetPoolMaxThreads( TP_POOL *pool, DWORD maximum ) RtlLeaveCriticalSection( &this->cs ); } +/*********************************************************************** + * TpSetPoolMinThreads (NTDLL.@) + */ +BOOL WINAPI TpSetPoolMinThreads( TP_POOL *pool, DWORD minimum ) +{ + struct threadpool *this = impl_from_TP_POOL( pool ); + NTSTATUS status = STATUS_SUCCESS; + + TRACE( "%p %u\n", pool, minimum ); + + RtlEnterCriticalSection( &this->cs ); + + while (this->num_workers < minimum) + { + HANDLE thread; + status = RtlCreateUserThread( GetCurrentProcess(), NULL, FALSE, NULL, 0, 0, + threadpool_worker_proc, this, &thread, NULL ); + if (status != STATUS_SUCCESS) + break; + + interlocked_inc( &this->refcount ); + this->num_workers++; + NtClose( thread ); + } + + if (status == STATUS_SUCCESS) + { + this->min_workers = minimum; + this->max_workers = max( this->min_workers, this->max_workers ); + } + + RtlLeaveCriticalSection( &this->cs ); + return !status; +} + /*********************************************************************** * TpSimpleTryPost (NTDLL.@) */