diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index a14d03b6b39..77e55e1a444 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -233,7 +233,7 @@ @ stdcall CloseThreadpoolCleanupGroupMembers(ptr long ptr) ntdll.TpReleaseCleanupGroupMembers # @ stub CloseThreadpoolIo @ stdcall CloseThreadpoolTimer(ptr) ntdll.TpReleaseTimer -# @ stub CloseThreadpoolWait +@ stdcall CloseThreadpoolWait(ptr) ntdll.TpReleaseWait @ stdcall CloseThreadpoolWork(ptr) ntdll.TpReleaseWork @ stdcall CmdBatNotification(long) @ stdcall CommConfigDialogA(str long ptr) @@ -335,7 +335,7 @@ @ stdcall CreateThreadpoolCleanupGroup() # @ stub CreateThreadpoolIo @ stdcall CreateThreadpoolTimer(ptr ptr ptr) -# @ stub CreateThreadpoolWait +@ stdcall CreateThreadpoolWait(ptr ptr ptr) @ stdcall CreateThreadpoolWork(ptr ptr ptr) @ stdcall CreateTimerQueue () @ stdcall CreateTimerQueueTimer(ptr long ptr ptr long long long) @@ -1457,7 +1457,7 @@ @ stdcall SetThreadpoolThreadMaximum(ptr long) ntdll.TpSetPoolMaxThreads @ stdcall SetThreadpoolThreadMinimum(ptr long) ntdll.TpSetPoolMinThreads @ stdcall SetThreadpoolTimer(ptr ptr long long) -# @ stub SetThreadpoolWait +@ stdcall SetThreadpoolWait(ptr long ptr) @ stdcall SetTimeZoneInformation(ptr) @ stub SetTimerQueueTimer # @ stub -arch=x86_64 SetUmsThreadInformation @@ -1572,7 +1572,7 @@ @ stdcall WaitForSingleObjectEx(long long long) # @ stub WaitForThreadpoolIoCallbacks @ stdcall WaitForThreadpoolTimerCallbacks(ptr long) ntdll.TpWaitForTimer -# @ stub WaitForThreadpoolWaitCallbacks +@ stdcall WaitForThreadpoolWaitCallbacks(ptr long) ntdll.TpWaitForWait @ stdcall WaitForThreadpoolWorkCallbacks(ptr long) ntdll.TpWaitForWork @ stdcall WaitNamedPipeA (str long) @ stdcall WaitNamedPipeW (wstr long) diff --git a/dlls/kernel32/thread.c b/dlls/kernel32/thread.c index 21ec276c4ca..c992e0d092e 100644 --- a/dlls/kernel32/thread.c +++ b/dlls/kernel32/thread.c @@ -941,6 +941,27 @@ PTP_TIMER WINAPI CreateThreadpoolTimer( PTP_TIMER_CALLBACK callback, PVOID userd return timer; } +/*********************************************************************** + * CreateThreadpoolWait (KERNEL32.@) + */ +PTP_WAIT WINAPI CreateThreadpoolWait( PTP_WAIT_CALLBACK callback, PVOID userdata, + TP_CALLBACK_ENVIRON *environment ) +{ + TP_WAIT *wait; + NTSTATUS status; + + TRACE( "%p, %p, %p\n", callback, userdata, environment ); + + status = TpAllocWait( &wait, callback, userdata, environment ); + if (status) + { + SetLastError( RtlNtStatusToDosError(status) ); + return NULL; + } + + return wait; +} + /*********************************************************************** * CreateThreadpoolWork (KERNEL32.@) */ @@ -981,6 +1002,28 @@ VOID WINAPI SetThreadpoolTimer( TP_TIMER *timer, FILETIME *due_time, TpSetTimer( timer, due_time ? &timeout : NULL, period, window_length ); } +/*********************************************************************** + * SetThreadpoolWait (KERNEL32.@) + */ +VOID WINAPI SetThreadpoolWait( TP_WAIT *wait, HANDLE handle, FILETIME *due_time ) +{ + LARGE_INTEGER timeout; + + TRACE( "%p, %p, %p\n", wait, handle, due_time ); + + if (!handle) + { + due_time = NULL; + } + else if (due_time) + { + timeout.u.LowPart = due_time->dwLowDateTime; + timeout.u.HighPart = due_time->dwHighDateTime; + } + + TpSetWait( wait, handle, due_time ? &timeout : NULL ); +} + /*********************************************************************** * TrySubmitThreadpoolCallback (KERNEL32.@) */ diff --git a/include/winternl.h b/include/winternl.h index e1707fdf6bb..7ab1bd86d5b 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -2621,6 +2621,7 @@ NTSYSAPI NTSTATUS WINAPI RtlLargeIntegerToChar(const ULONGLONG *,ULONG,ULONG,PC 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 TpAllocWait(TP_WAIT **,PTP_WAIT_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 *); NTSYSAPI NTSTATUS WINAPI TpCallbackMayRunLong(TP_CALLBACK_INSTANCE *); @@ -2635,12 +2636,15 @@ 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 TpReleaseWait(TP_WAIT *); 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 void WINAPI TpSetWait(TP_WAIT *,HANDLE,LARGE_INTEGER *); NTSYSAPI NTSTATUS WINAPI TpSimpleTryPost(PTP_SIMPLE_CALLBACK,PVOID,TP_CALLBACK_ENVIRON *); NTSYSAPI void WINAPI TpWaitForTimer(TP_TIMER *,BOOL); +NTSYSAPI void WINAPI TpWaitForWait(TP_WAIT *,BOOL); NTSYSAPI void WINAPI TpWaitForWork(TP_WORK *,BOOL); /* Wine internal functions */