From: Sebastian Lackner Subject: [11/12] kernel32: Forward remaining threadpool functions to ntdll. Message-Id: <5595D09F.8020603@fds-team.de> Date: Fri, 3 Jul 2015 02:00:31 +0200 --- dlls/kernel32/kernel32.spec | 10 +++++----- dlls/kernel32/tests/thread.c | 6 +++--- dlls/kernel32/thread.c | 40 ++++++++++++++++++++++++++++++++++++++++ include/winternl.h | 5 +++++ 4 files changed, 53 insertions(+), 8 deletions(-) diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index 0825bdb..a14d03b 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -228,7 +228,7 @@ # @ stub ClosePrivateNamespace @ stdcall CloseProfileUserMapping() @ stub CloseSystemHandle -# @ stub CloseThreadpool +@ stdcall CloseThreadpool(ptr) ntdll.TpReleasePool @ stdcall CloseThreadpoolCleanupGroup(ptr) ntdll.TpReleaseCleanupGroup @ stdcall CloseThreadpoolCleanupGroupMembers(ptr long ptr) ntdll.TpReleaseCleanupGroupMembers # @ stub CloseThreadpoolIo @@ -331,7 +331,7 @@ @ stdcall CreateSymbolicLinkW(wstr wstr long) @ stdcall CreateTapePartition(long long long long) @ stdcall CreateThread(ptr long ptr long long ptr) -# @ stub CreateThreadpool +@ stdcall CreateThreadpool(ptr) @ stdcall CreateThreadpoolCleanupGroup() # @ stub CreateThreadpoolIo @ stdcall CreateThreadpoolTimer(ptr ptr ptr) @@ -1454,8 +1454,8 @@ # @ stub SetThreadToken @ stdcall SetThreadUILanguage(long) # @ stub SetThreadpoolStackInformation -# @ stub SetThreadpoolThreadMaximum -# @ stub SetThreadpoolThreadMinimum +@ stdcall SetThreadpoolThreadMaximum(ptr long) ntdll.TpSetPoolMaxThreads +@ stdcall SetThreadpoolThreadMinimum(ptr long) ntdll.TpSetPoolMinThreads @ stdcall SetThreadpoolTimer(ptr ptr long long) # @ stub SetThreadpoolWait @ stdcall SetTimeZoneInformation(ptr) @@ -1509,7 +1509,7 @@ @ stdcall TryAcquireSRWLockExclusive(ptr) ntdll.RtlTryAcquireSRWLockExclusive @ stdcall TryAcquireSRWLockShared(ptr) ntdll.RtlTryAcquireSRWLockShared @ stdcall TryEnterCriticalSection(ptr) ntdll.RtlTryEnterCriticalSection -# @ stub TrySubmitThreadpoolCallback +@ stdcall TrySubmitThreadpoolCallback(ptr ptr ptr) @ stdcall TzSpecificLocalTimeToSystemTime(ptr ptr ptr) # @ stub TzSpecificLocalTimeToSystemTimeEx # @ stub -arch=x86_64 uaw_lstrcmpW diff --git a/dlls/kernel32/tests/thread.c b/dlls/kernel32/tests/thread.c index d3ecd2a..25801b2 100644 --- a/dlls/kernel32/tests/thread.c +++ b/dlls/kernel32/tests/thread.c @@ -1627,8 +1627,8 @@ static void test_threadpool(void) int workcalled = 0; if (!pCreateThreadpool) { - todo_wine win_skip("thread pool apis not supported.\n"); - return; + win_skip("thread pool apis not supported.\n"); + return; } work = pCreateThreadpoolWork(threadpool_workcallback, &workcalled, NULL); @@ -1640,7 +1640,7 @@ static void test_threadpool(void) ok (workcalled == 1, "expected work to be called once, got %d\n", workcalled); pool = pCreateThreadpool(NULL); - todo_wine ok (pool != NULL, "CreateThreadpool failed\n"); + ok (pool != NULL, "CreateThreadpool failed\n"); } static void test_reserved_tls(void) diff --git a/dlls/kernel32/thread.c b/dlls/kernel32/thread.c index c8e906d..21ec276 100644 --- a/dlls/kernel32/thread.c +++ b/dlls/kernel32/thread.c @@ -881,6 +881,26 @@ BOOL WINAPI CallbackMayRunLong( TP_CALLBACK_INSTANCE *instance ) } /*********************************************************************** + * CreateThreadpool (KERNEL32.@) + */ +PTP_POOL WINAPI CreateThreadpool( PVOID reserved ) +{ + TP_POOL *pool; + NTSTATUS status; + + TRACE( "%p\n", reserved ); + + status = TpAllocPool( &pool, reserved ); + if (status) + { + SetLastError( RtlNtStatusToDosError(status) ); + return NULL; + } + + return pool; +} + +/*********************************************************************** * CreateThreadpoolCleanupGroup (KERNEL32.@) */ PTP_CLEANUP_GROUP WINAPI CreateThreadpoolCleanupGroup( void ) @@ -960,3 +980,23 @@ VOID WINAPI SetThreadpoolTimer( TP_TIMER *timer, FILETIME *due_time, TpSetTimer( timer, due_time ? &timeout : NULL, period, window_length ); } + +/*********************************************************************** + * TrySubmitThreadpoolCallback (KERNEL32.@) + */ +BOOL WINAPI TrySubmitThreadpoolCallback( PTP_SIMPLE_CALLBACK callback, PVOID userdata, + TP_CALLBACK_ENVIRON *environment ) +{ + NTSTATUS status; + + TRACE( "%p, %p, %p\n", callback, userdata, environment ); + + status = TpSimpleTryPost( callback, userdata, environment ); + if (status) + { + SetLastError( RtlNtStatusToDosError(status) ); + return FALSE; + } + + return TRUE; +} diff --git a/include/winternl.h b/include/winternl.h index 5b07994..e1707fd 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -2619,6 +2619,7 @@ NTSYSAPI NTSTATUS WINAPI RtlLargeIntegerToChar(const ULONGLONG *,ULONG,ULONG,PC /* Threadpool functions */ NTSYSAPI NTSTATUS WINAPI TpAllocCleanupGroup(TP_CLEANUP_GROUP **); +NTSYSAPI NTSTATUS WINAPI TpAllocPool(TP_POOL **,PVOID); NTSYSAPI NTSTATUS WINAPI TpAllocTimer(TP_TIMER **,PTP_TIMER_CALLBACK,PVOID,TP_CALLBACK_ENVIRON *); NTSYSAPI NTSTATUS WINAPI TpAllocWork(TP_WORK **,PTP_WORK_CALLBACK,PVOID,TP_CALLBACK_ENVIRON *); NTSYSAPI void WINAPI TpCallbackLeaveCriticalSectionOnCompletion(TP_CALLBACK_INSTANCE *,RTL_CRITICAL_SECTION *); @@ -2632,9 +2633,13 @@ NTSYSAPI BOOL WINAPI TpIsTimerSet(TP_TIMER *); NTSYSAPI void WINAPI TpPostWork(TP_WORK *); NTSYSAPI void WINAPI TpReleaseCleanupGroup(TP_CLEANUP_GROUP *); NTSYSAPI void WINAPI TpReleaseCleanupGroupMembers(TP_CLEANUP_GROUP *,BOOL,PVOID); +NTSYSAPI void WINAPI TpReleasePool(TP_POOL *); NTSYSAPI void WINAPI TpReleaseTimer(TP_TIMER *); NTSYSAPI void WINAPI TpReleaseWork(TP_WORK *); +NTSYSAPI void WINAPI TpSetPoolMaxThreads(TP_POOL *,DWORD); +NTSYSAPI BOOL WINAPI TpSetPoolMinThreads(TP_POOL *,DWORD); NTSYSAPI void WINAPI TpSetTimer(TP_TIMER *, LARGE_INTEGER *,LONG,LONG); +NTSYSAPI NTSTATUS WINAPI TpSimpleTryPost(PTP_SIMPLE_CALLBACK,PVOID,TP_CALLBACK_ENVIRON *); NTSYSAPI void WINAPI TpWaitForTimer(TP_TIMER *,BOOL); NTSYSAPI void WINAPI TpWaitForWork(TP_WORK *,BOOL); -- 2.4.4