29#define ERR(fmt, ...) DPRINT1(fmt, ##__VA_ARGS__)
30#define FIXME(fmt, ...) DPRINT(fmt, ##__VA_ARGS__)
31#define WARN(fmt, ...) DPRINT(fmt, ##__VA_ARGS__)
32#define TRACE(fmt, ...) DPRINT(fmt, ##__VA_ARGS__)
34#define ARRAY_SIZE(_x) (sizeof((_x))/sizeof((_x)[0]))
45#define PRTL_WORK_ITEM_ROUTINE WORKERCALLBACKFUNC
47#define CRITICAL_SECTION RTL_CRITICAL_SECTION
48#define GetProcessHeap() RtlGetProcessHeap()
49#define GetCurrentProcess() NtCurrentProcess()
50#define GetCurrentThread() NtCurrentThread()
51#define GetCurrentThreadId() HandleToULong(NtCurrentTeb()->ClientId.UniqueThread)
58#define WIN32_NO_STATUS
64#include "ntdll_misc.h"
79#define EXPIRE_NEVER (~(ULONGLONG)0)
80#define TIMER_QUEUE_MAGIC 0x516d6954
106 0, 0, { (
DWORD_PTR)(__FILE__
": threadpool_compl_cs") }
139#define THREADPOOL_WORKER_TIMEOUT 5000
140#define MAXIMUM_WAITQUEUE_OBJECTS (MAXIMUM_WAIT_OBJECTS - 1)
313 0, 0, { (
DWORD_PTR)(__FILE__
": timerqueue.cs") }
342 0, 0, { (
DWORD_PTR)(__FILE__
": waitqueue.cs") }
383 0, 0, { (
DWORD_PTR)(__FILE__
": ioqueue.cs") }
443 unsigned int new_capacity, max_capacity;
446 if (
count <= *capacity)
450 if (
count > max_capacity)
453 new_capacity =
max(4, *capacity);
454 while (new_capacity <
count && new_capacity <= max_capacity / 2)
456 if (new_capacity <
count)
457 new_capacity = max_capacity;
462 *elements = new_elements;
463 *capacity = new_capacity;
523 memset( &environment, 0,
sizeof(environment) );
555 ERR(
"NtRemoveIoCompletion failed: 0x%lx\n",
res);
559 DWORD transferred = 0;
663 if (
t->destroy &&
t->runcount == 0)
672 t->callback(
t->param,
TRUE);
732 next =
t->expire +
t->period;
841 if (
t->runcount == 0)
943 FIXME(
"asynchronous return on completion event unimplemented\n");
962 if (!default_timer_queue)
974 return default_timer_queue;
1115 else if (CompletionEvent)
1116 event = CompletionEvent;
1120 if (
t->runcount == 0 &&
event)
1147 ULONGLONG timeout_lower, timeout_upper, new_timeout;
1152 TRACE(
"starting timer queue thread\n" );
1166 if (
timer->u.timer.timeout >
now.QuadPart)
1175 if (
timer->u.timer.period && !
timer->shutdown)
1179 timer->u.timer.timeout =
now.QuadPart + 1;
1185 if (
timer->u.timer.timeout < other_timer->
u.
timer.timeout)
1200 if (other_timer->
u.
timer.timeout >= timeout_upper)
1203 timeout_lower = other_timer->
u.
timer.timeout;
1204 new_timeout = timeout_lower + (
ULONGLONG)other_timer->
u.
timer.window_length * 10000;
1205 if (new_timeout < timeout_upper)
1206 timeout_upper = new_timeout;
1212 timeout.QuadPart = timeout_lower;
1230 TRACE(
"terminating timer queue thread\n" );
1248 pool->stack_info.StackReserve,
pool->stack_info.StackCommit,
1253 pool->num_workers++;
1273 timer->u.timer.timeout = 0;
1274 timer->u.timer.period = 0;
1275 timer->u.timer.window_length = 0;
1294 timer->u.timer.timer_initialized =
TRUE;
1312 if (
timer->u.timer.timer_initialized)
1315 if (
timer->u.timer.timer_pending)
1350 TRACE(
"starting wait queue thread\n" );
1365 if (
wait->u.wait.timeout <=
now.QuadPart)
1376 wait->num_pending_callbacks++;
1401 assert( num_handles == 0 );
1421 if (
wait->u.wait.bucket)
1432 wait->u.wait.signaled++;
1433 wait->num_pending_callbacks++;
1441 WARN(
"wait object %p triggered while object was destroyed\n",
wait);
1470 wait->
u.
wait.bucket = other_bucket;
1478 wait->
u.
wait.bucket = other_bucket;
1501 TRACE(
"terminating wait queue thread\n" );
1523 wait->
u.
wait.signaled = 0;
1526 wait->
u.
wait.timeout = 0;
1537 wait->
u.
wait.bucket = bucket;
1574 wait->
u.
wait.bucket = bucket;
1598 if (wait->
u.
wait.bucket)
1629 TRACE(
"starting I/O completion thread\n" );
1638 ERR(
"NtRemoveIoCompletion failed, status %#lx.\n",
status);
1646 if (
io && (
io->shutdown ||
io->u.io.shutting_down))
1649 if (!
io->u.io.pending_count)
1651 if (
io->u.io.skipped_count)
1652 --
io->u.io.skipped_count;
1654 if (
io->u.io.skipped_count)
1666 TRACE(
"Releasing io %p.\n",
io );
1674 TRACE(
"pending_count %u.\n",
io->u.io.pending_count );
1676 if (
io->u.io.pending_count)
1678 --
io->u.io.pending_count;
1680 io->u.io.completion_count + 1,
sizeof(*
io->u.io.completions)))
1682 ERR(
"Failed to allocate memory.\n" );
1715 TRACE(
"terminating I/O completion thread\n" );
1805 pool->cs.DebugInfo->Spare[0] = (
DWORD_PTR)(__FILE__
": threadpool.cs");
1812 pool->max_workers = 500;
1813 pool->min_workers = 0;
1814 pool->num_workers = 0;
1815 pool->num_busy_workers = 0;
1819 TRACE(
"allocated threadpool %p\n",
pool );
1852 TRACE(
"destroying threadpool %p\n",
pool );
1859 pool->cs.DebugInfo->Spare[0] = 0;
1883 if (environment->
Version == 3)
1922 if (!
pool->num_workers)
1968 group->refcount = 1;
1976 group->cs.DebugInfo->Spare[0] = (
DWORD_PTR)(__FILE__
": threadpool_group.cs");
2013 group->cs.DebugInfo->Spare[0] = 0;
2031 object->refcount = 1;
2032 object->shutdown =
FALSE;
2034 object->pool =
pool;
2035 object->group =
NULL;
2036 object->userdata = userdata;
2037 object->group_cancel_callback =
NULL;
2038 object->finalization_callback =
NULL;
2039 object->may_run_long = 0;
2040 object->race_dll =
NULL;
2044 object->is_group_member =
FALSE;
2049 object->completed_event =
NULL;
2050 object->num_pending_callbacks = 0;
2051 object->num_running_callbacks = 0;
2052 object->num_associated_callbacks = 0;
2057 FIXME(
"unsupported environment version %lu\n", environment->
Version );
2062 object->may_run_long = environment->
u.
s.LongFunction != 0;
2063 object->race_dll = environment->
RaceDll;
2065 if (environment->
Version == 3)
2074 FIXME(
"activation context not supported yet\n" );
2076 if (environment->
u.
s.Persistent)
2077 FIXME(
"persistent threads not supported yet\n" );
2083 TRACE(
"allocated object %p of type %u\n",
object,
object->type );
2089 if (is_simple_callback)
2099 object->is_group_member =
TRUE;
2103 if (is_simple_callback)
2109 ++
object->pool->num_busy_workers;
2130 if (
pool->num_busy_workers >=
pool->num_workers &&
2131 pool->num_workers <
pool->max_workers)
2136 if (!
object->num_pending_callbacks++)
2141 object->u.wait.signaled++;
2161 LONG pending_callbacks = 0;
2164 if (
object->num_pending_callbacks)
2166 pending_callbacks =
object->num_pending_callbacks;
2167 object->num_pending_callbacks = 0;
2171 object->u.wait.signaled = 0;
2175 object->u.io.skipped_count +=
object->u.io.pending_count;
2176 object->u.io.pending_count = 0;
2180 while (pending_callbacks--)
2186 if (
object->num_pending_callbacks)
2192 return !
object->num_running_callbacks;
2194 return !
object->num_associated_callbacks;
2226 if (!
io->shutdown && !--
ioqueue.objcount)
2257 TRACE(
"destroying object %p of type %u\n",
object,
object->type );
2270 if (
object->is_group_member)
2273 object->is_group_member =
FALSE;
2321 object->num_pending_callbacks--;
2327 if (wait_result ==
WAIT_OBJECT_0)
object->u.wait.signaled--;
2332 completion =
object->u.io.completions[--
object->u.io.completion_count];
2336 object->num_associated_callbacks++;
2337 object->num_running_callbacks++;
2346 instance.may_run_long =
object->may_run_long;
2350 instance.cleanup.semaphore_count = 0;
2358 TRACE(
"executing simple callback %p(%p, %p)\n",
2359 object->u.simple.callback, callback_instance,
object->userdata );
2360 object->u.simple.callback( callback_instance,
object->userdata );
2361 TRACE(
"callback %p returned\n",
object->u.simple.callback );
2367 TRACE(
"executing work callback %p(%p, %p, %p)\n",
2368 object->u.work.callback, callback_instance,
object->userdata,
object );
2369 object->u.work.callback( callback_instance,
object->userdata, (
TP_WORK *)
object );
2370 TRACE(
"callback %p returned\n",
object->u.work.callback );
2376 TRACE(
"executing timer callback %p(%p, %p, %p)\n",
2377 object->u.timer.callback, callback_instance,
object->userdata,
object );
2378 object->u.timer.callback( callback_instance,
object->userdata, (
TP_TIMER *)
object );
2379 TRACE(
"callback %p returned\n",
object->u.timer.callback );
2385 TRACE(
"executing wait callback %p(%p, %p, %p, %lu)\n",
2386 object->u.wait.callback, callback_instance,
object->userdata,
object, wait_result );
2387 object->u.wait.callback( callback_instance,
object->userdata, (
TP_WAIT *)
object, wait_result );
2388 TRACE(
"callback %p returned\n",
object->u.wait.callback );
2394 TRACE(
"executing I/O callback %p(%p, %p, %#Ix, %p, %p)\n",
2395 object->u.io.callback, callback_instance,
object->userdata,
2397 object->u.io.callback( callback_instance,
object->userdata,
2399 TRACE(
"callback %p returned\n",
object->u.io.callback );
2409 if (
object->finalization_callback)
2411 TRACE(
"executing finalization callback %p(%p, %p)\n",
2412 object->finalization_callback, callback_instance,
object->userdata );
2413 object->finalization_callback( callback_instance,
object->userdata );
2414 TRACE(
"callback %p returned\n",
object->finalization_callback );
2418 if (
instance.cleanup.critical_section)
2450 object->shutdown =
TRUE;
2453 object->num_running_callbacks--;
2459 object->num_associated_callbacks--;
2478 TRACE(
"starting worker thread for pool %p\n",
pool );
2492 if (
object->num_pending_callbacks > 1)
2498 pool->num_busy_workers--;
2515 (!
pool->min_workers && !
pool->objcount)))
2520 pool->num_workers--;
2523 TRACE(
"terminating worker thread for pool %p\n",
pool );
2622 object->u.timer.callback =
callback;
2657 object->u.wait.callback =
callback;
2658 object->u.wait.flags =
flags;
2708 object->u.work.callback =
callback;
2726 TRACE(
"pending_count %u.\n", this->
u.io.pending_count);
2728 this->
u.io.pending_count--;
2746 if (!this->
cleanup.critical_section)
2747 this->
cleanup.critical_section = crit;
2764 ERR(
"called from wrong thread, ignoring\n");
2768 if (this->may_run_long)
2771 pool =
object->pool;
2775 if (
pool->num_busy_workers >=
pool->num_workers)
2777 if (
pool->num_workers <
pool->max_workers)
2788 this->may_run_long =
TRUE;
2844 this->
cleanup.library = module;
2860 ERR(
"called from wrong thread, ignoring\n");
2864 if (!this->associated)
2867 pool =
object->pool;
2870 object->num_associated_callbacks--;
2875 this->associated =
FALSE;
2887 return this->
u.timer.timer_set;
2922 struct list members;
2924 TRACE(
"%p %u %p\n",
group, cancel_pending, userdata );
2940 object->is_group_member =
FALSE;
2944 object->is_group_member =
FALSE;
2971 if (cancel_pending &&
object->group_cancel_callback)
2973 TRACE(
"executing group cancel callback %p(%p, %p)\n",
2974 object->group_cancel_callback,
object->userdata, userdata );
2975 object->group_cancel_callback(
object->userdata, userdata );
2976 TRACE(
"callback %p returned\n",
object->group_cancel_callback );
2983 object->shutdown =
TRUE;
2999 this->
u.io.shutting_down =
TRUE;
3000 can_destroy = !this->
u.io.pending_count && !this->
u.io.skipped_count;
3124 assert( this->
u.timer.timer_initialized );
3125 this->
u.timer.timer_set = timeout !=
NULL;
3148 submit_timer =
TRUE;
3153 if (this->
u.timer.timer_pending)
3156 this->
u.timer.timer_pending =
FALSE;
3162 this->
u.timer.timeout = timestamp;
3163 this->
u.timer.period =
period;
3170 if (this->
u.timer.timeout < other_timer->
u.
timer.timeout)
3179 this->
u.timer.timer_pending =
TRUE;
3200 assert( this->
u.wait.bucket );
3203 if (handle || this->
u.wait.wait_pending)
3224 this->
u.wait.wait_pending =
TRUE;
3225 this->
u.wait.timeout = timestamp;
3230 this->
u.wait.wait_pending =
FALSE;
3264 object->u.simple.callback =
callback;
3281 this->
u.io.pending_count++;
3293 TRACE(
"%p %d\n",
io, cancel_pending );
3321 TRACE(
"%p %d\n",
wait, cancel_pending );
3335 TRACE(
"%p %u\n",
work, cancel_pending );
3421 TRACE(
"out %p, handle %p, callback %p, context %p, milliseconds %lu, flags %lx\n",
3424 memset( &environment, 0,
sizeof(environment) );
3434 object->u.wait.rtl_callback =
callback;
3473 object->completed_event =
event;
3477 if (
object->num_pending_callbacks +
object->num_running_callbacks
void CALLBACK completion(DWORD dwError, DWORD cbTransferred, LPWSAOVERLAPPED lpOverlapped, DWORD dwFlags)
void destroy(_Tp *__pointer)
#define InterlockedIncrement
#define InterlockedDecrement
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
static void list_remove(struct list_entry *entry)
static int list_empty(struct list_entry *head)
static void list_add_tail(struct list_entry *head, struct list_entry *entry)
static void list_init(struct list_entry *head)
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
_In_ CDROM_SCAN_FOR_SPECIAL_INFO _In_ PCDROM_SCAN_FOR_SPECIAL_HANDLER Function
#define STATUS_INVALID_HANDLE
static HINSTANCE instance
#define INVALID_HANDLE_VALUE
#define GetCurrentProcess()
static void cleanup(void)
static void list_move_tail(struct list_head *list, struct list_head *head)
static uacpi_status set_event(uacpi_u8 event, uacpi_u8 value)
_Must_inspect_result_ _In_opt_ PFLT_INSTANCE _Out_ PHANDLE FileHandle
@ FileCompletionInformation
GLuint GLuint GLsizei count
GLdouble GLdouble GLdouble GLdouble q
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
DWORD(CALLBACK * PRTL_WORK_ITEM_ROUTINE)(LPVOID)
NTSYSAPI void WINAPI TpWaitForWork(TP_WORK *, BOOL)
NTSYSAPI void WINAPI TpReleaseWork(TP_WORK *)
NTSYSAPI void WINAPI TpDisassociateCallback(TP_CALLBACK_INSTANCE *)
NTSYSAPI NTSTATUS WINAPI TpQueryPoolStackInformation(TP_POOL *, TP_POOL_STACK_INFORMATION *stack_info)
NTSYSAPI void WINAPI TpStartAsyncIoOperation(TP_IO *)
NTSYSAPI void WINAPI TpReleasePool(TP_POOL *)
NTSYSAPI NTSTATUS WINAPI TpAllocTimer(TP_TIMER **, PTP_TIMER_CALLBACK, PVOID, TP_CALLBACK_ENVIRON *)
NTSYSAPI PVOID WINAPI RtlReAllocateHeap(HANDLE, ULONG, PVOID, SIZE_T) __WINE_ALLOC_SIZE(4) __WINE_DEALLOC(RtlFreeHeap
VOID(CALLBACK * PRTL_OVERLAPPED_COMPLETION_ROUTINE)(DWORD, DWORD, LPVOID)
NTSYSAPI NTSTATUS WINAPI TpAllocCleanupGroup(TP_CLEANUP_GROUP **)
void(NTAPI * RTL_WAITORTIMERCALLBACKFUNC)(PVOID, BOOLEAN)
NTSYSAPI void WINAPI TpWaitForTimer(TP_TIMER *, BOOL)
NTSYSAPI void WINAPI TpWaitForIoCompletion(TP_IO *, BOOL)
NTSYSAPI void WINAPI TpCancelAsyncIoOperation(TP_IO *)
NTSYSAPI BOOL WINAPI TpIsTimerSet(TP_TIMER *)
NTSYSAPI void WINAPI TpReleaseTimer(TP_TIMER *)
NTSYSAPI void WINAPI TpPostWork(TP_WORK *)
NTSYSAPI void WINAPI TpWaitForWait(TP_WAIT *, BOOL)
NTSYSAPI NTSTATUS WINAPI TpAllocIoCompletion(TP_IO **, HANDLE, PTP_IO_CALLBACK, void *, TP_CALLBACK_ENVIRON *)
NTSYSAPI void WINAPI TpSetWait(TP_WAIT *, HANDLE, LARGE_INTEGER *)
NTSYSAPI NTSTATUS WINAPI TpAllocPool(TP_POOL **, PVOID)
NTSYSAPI NTSTATUS WINAPI RtlInitializeCriticalSectionEx(RTL_CRITICAL_SECTION *, ULONG, ULONG)
NTSYSAPI void WINAPI TpReleaseIoCompletion(TP_IO *)
void(CALLBACK * PNTAPCFUNC)(ULONG_PTR, ULONG_PTR, ULONG_PTR)
void(CALLBACK * PRTL_THREAD_START_ROUTINE)(LPVOID)
NTSYSAPI NTSTATUS WINAPI TpAllocWait(TP_WAIT **, PTP_WAIT_CALLBACK, PVOID, TP_CALLBACK_ENVIRON *)
NTSYSAPI void WINAPI TpSetPoolMaxThreads(TP_POOL *, DWORD)
NTSYSAPI void WINAPI TpCallbackReleaseSemaphoreOnCompletion(TP_CALLBACK_INSTANCE *, HANDLE, DWORD)
NTSYSAPI NTSTATUS WINAPI TpAllocWork(TP_WORK **, PTP_WORK_CALLBACK, PVOID, TP_CALLBACK_ENVIRON *)
NTSYSAPI ULONG WINAPI RtlNtStatusToDosError(NTSTATUS)
NTSYSAPI void WINAPI TpReleaseCleanupGroupMembers(TP_CLEANUP_GROUP *, BOOL, PVOID)
NTSYSAPI void WINAPI TpReleaseCleanupGroup(TP_CLEANUP_GROUP *)
NTSYSAPI void WINAPI TpSetTimer(TP_TIMER *, LARGE_INTEGER *, LONG, LONG)
NTSYSAPI NTSTATUS WINAPI TpSimpleTryPost(PTP_SIMPLE_CALLBACK, PVOID, TP_CALLBACK_ENVIRON *)
NTSYSAPI NTSTATUS WINAPI TpCallbackMayRunLong(TP_CALLBACK_INSTANCE *)
void(CALLBACK * PTP_IO_CALLBACK)(PTP_CALLBACK_INSTANCE, void *, void *, IO_STATUS_BLOCK *, PTP_IO)
NTSYSAPI NTSTATUS WINAPI TpSetPoolStackInformation(TP_POOL *, TP_POOL_STACK_INFORMATION *stack_info)
NTSYSAPI void WINAPI TpReleaseWait(TP_WAIT *)
#define InterlockedCompareExchangePointer
NTSTATUS NTAPI NtSetIoCompletion(IN HANDLE IoCompletionPortHandle, IN PVOID CompletionKey, IN PVOID CompletionContext, IN NTSTATUS CompletionStatus, IN ULONG CompletionInformation)
NTSTATUS NTAPI NtRemoveIoCompletion(IN HANDLE IoCompletionHandle, OUT PVOID *KeyContext, OUT PVOID *ApcContext, OUT PIO_STATUS_BLOCK IoStatusBlock, IN PLARGE_INTEGER Timeout OPTIONAL)
NTSTATUS NTAPI NtCreateIoCompletion(OUT PHANDLE IoCompletionHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN ULONG NumberOfConcurrentThreads)
NTSTATUS NTAPI LdrUnloadDll(_In_ PVOID BaseAddress)
NTSTATUS NTAPI LdrAddRefDll(_In_ ULONG Flags, _In_ PVOID BaseAddress)
static const CLSID * objects[]
static IPrintDialogCallback callback
#define IO_COMPLETION_ALL_ACCESS
static HANDLE PIO_APC_ROUTINE PVOID PIO_STATUS_BLOCK io
static PIO_STATUS_BLOCK iosb
static TP_CALLBACK_ENVIRON *static TP_CALLBACK_ENVIRON *static PTP_WORK_CALLBACK
static PTP_TIMER_CALLBACK
static TP_CALLBACK_ENVIRON *static PTP_WAIT_CALLBACK
static void TP_CALLBACK_ENVIRON *static PVOID
NTSTATUS NTAPI NtReleaseMutant(IN HANDLE MutantHandle, IN PLONG PreviousCount OPTIONAL)
NTSYSAPI VOID NTAPI RtlInitializeConditionVariable(_Out_ PRTL_CONDITION_VARIABLE ConditionVariable)
NTSYSAPI NTSTATUS NTAPI RtlDeleteCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
NTSYSAPI NTSTATUS NTAPI RtlQueueWorkItem(_In_ WORKERCALLBACKFUNC Function, _In_opt_ PVOID Context, _In_ ULONG Flags)
NTSYSAPI VOID NTAPI RtlWakeAllConditionVariable(_Inout_ PRTL_CONDITION_VARIABLE ConditionVariable)
NTSYSAPI NTSTATUS NTAPI RtlRegisterWait(_In_ PHANDLE phNewWaitObject, _In_ HANDLE hObject, _In_ WAITORTIMERCALLBACKFUNC Callback, _In_ PVOID pvContext, _In_ ULONG ulMilliseconds, _In_ ULONG ulFlags)
NTSYSAPI NTSTATUS NTAPI RtlSleepConditionVariableCS(_Inout_ PRTL_CONDITION_VARIABLE ConditionVariable, _Inout_ PRTL_CRITICAL_SECTION CriticalSection, _In_opt_ PLARGE_INTEGER TimeOut)
NTSYSAPI NTSTATUS NTAPI RtlEnterCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
NTSYSAPI VOID NTAPI RtlExitUserThread(_In_ NTSTATUS Status)
NTSYSAPI VOID NTAPI RtlWakeConditionVariable(_Inout_ PRTL_CONDITION_VARIABLE ConditionVariable)
NTSYSAPI NTSTATUS NTAPI RtlLeaveCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
NTSYSAPI NTSTATUS NTAPI RtlCreateUserThread(_In_ PVOID ThreadContext, _Out_ HANDLE *OutThreadHandle, _Reserved_ PVOID Reserved1, _Reserved_ PVOID Reserved2, _Reserved_ PVOID Reserved3, _Reserved_ PVOID Reserved4, _Reserved_ PVOID Reserved5, _Reserved_ PVOID Reserved6, _Reserved_ PVOID Reserved7, _Reserved_ PVOID Reserved8)
NTSYSAPI NTSTATUS NTAPI RtlInitializeCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
NTSYSAPI NTSTATUS NTAPI RtlDeregisterWaitEx(_In_ HANDLE hWaitHandle, _In_opt_ HANDLE hCompletionEvent)
NTSYSAPI NTSTATUS NTAPI RtlDeregisterWait(_In_ HANDLE hWaitHandle)
ULONG(NTAPI * PTHREAD_START_ROUTINE)(PVOID Parameter)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI NTSTATUS NTAPI NtSetInformationFile(IN HANDLE hFile, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN PVOID FileInformationBuffer, IN ULONG FileInformationBufferLength, IN FILE_INFORMATION_CLASS FileInfoClass)
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
NTSYSAPI NTSTATUS NTAPI NtWaitForSingleObject(IN HANDLE hObject, IN BOOLEAN bAlertable, IN PLARGE_INTEGER Timeout)
VOID NTAPI RtlpInitializeThreadPooling(VOID)
NTSTATUS NTAPI NtSetEvent(IN HANDLE EventHandle, OUT PLONG PreviousState OPTIONAL)
NTSTATUS NTAPI NtCreateEvent(OUT PHANDLE EventHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN EVENT_TYPE EventType, IN BOOLEAN InitialState)
NTSTATUS NTAPI NtQueryPerformanceCounter(OUT PLARGE_INTEGER PerformanceCounter, OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL)
NTSTATUS NTAPI NtQuerySystemTime(OUT PLARGE_INTEGER SystemTime)
NTSTATUS NTAPI NtSetInformationThread(_In_ HANDLE ThreadHandle, _In_ THREADINFOCLASS ThreadInformationClass, _In_reads_bytes_(ThreadInformationLength) PVOID ThreadInformation, _In_ ULONG ThreadInformationLength)
#define STATUS_TOO_MANY_THREADS
#define STATUS_INVALID_PARAMETER_1
NTSTATUS NTAPI NtWaitForMultipleObjects(IN ULONG ObjectCount, IN PHANDLE HandleArray, IN WAIT_TYPE WaitType, IN BOOLEAN Alertable, IN PLARGE_INTEGER TimeOut OPTIONAL)
static unsigned __int64 next
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
#define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field)
#define LIST_FOR_EACH(cursor, list)
__WINE_SERVER_LIST_INLINE void list_add_before(struct list *elem, struct list *to_add)
static RTL_CRITICAL_SECTION_DEBUG waitqueue_debug
static void tp_object_wait(struct threadpool_object *object, BOOL group_wait)
RTL_CRITICAL_SECTION threadpool_compl_cs
static BOOL tp_object_release(struct threadpool_object *object)
NTSTATUS WINAPI RtlCreateTimer(HANDLE TimerQueue, HANDLE *NewTimer, RTL_WAITORTIMERCALLBACKFUNC Callback, PVOID Parameter, DWORD DueTime, DWORD Period, ULONG Flags)
static PLARGE_INTEGER get_nt_timeout(PLARGE_INTEGER pTime, ULONG timeout)
NTSTATUS WINAPI RtlSetIoCompletionCallback(HANDLE FileHandle, PRTL_OVERLAPPED_COMPLETION_ROUTINE Function, ULONG Flags)
static void set_thread_name(const WCHAR *name)
static void CALLBACK ioqueue_thread_proc(void *param)
static struct threadpool_group * impl_from_TP_CLEANUP_GROUP(TP_CLEANUP_GROUP *group)
VOID WINAPI TpCallbackUnloadDllOnCompletion(TP_CALLBACK_INSTANCE *instance, HMODULE module)
static void queue_move_timer(struct queue_timer *t, ULONGLONG time, BOOL set_event)
static struct @5307 waitqueue
static void CALLBACK process_rtl_work_item(TP_CALLBACK_INSTANCE *instance, void *userdata)
static void tp_group_shutdown(struct threadpool_group *group)
NTSTATUS WINAPI RtlCreateTimerQueue(PHANDLE NewTimerQueue)
#define MAXIMUM_WAITQUEUE_OBJECTS
static void queue_add_timer(struct queue_timer *t, ULONGLONG time, BOOL set_event)
BOOL WINAPI TpSetPoolMinThreads(TP_POOL *pool, DWORD minimum)
static BOOL array_reserve(void **elements, unsigned int *capacity, unsigned int count, unsigned int size)
static struct @5306 timerqueue
static struct list * threadpool_get_next_item(const struct threadpool *pool)
static void tp_object_initialize(struct threadpool_object *object, struct threadpool *pool, PVOID userdata, TP_CALLBACK_ENVIRON *environment)
static void tp_waitqueue_unlock(struct threadpool_object *wait)
static ULONG queue_get_timeout(struct timer_queue *q)
static NTSTATUS tp_waitqueue_lock(struct threadpool_object *wait)
static BOOL tp_group_release(struct threadpool_group *group)
static struct threadpool * default_threadpool
static ULONGLONG queue_current_time(void)
static DWORD WINAPI timer_callback_wrapper(LPVOID p)
static NTSTATUS tp_threadpool_alloc(struct threadpool **out)
NTSTATUS WINAPI RtlDeleteTimer(HANDLE TimerQueue, HANDLE Timer, HANDLE CompletionEvent)
static void tp_object_submit(struct threadpool_object *object, BOOL signaled)
static NTSTATUS tp_new_worker_thread(struct threadpool *pool)
static BOOL tp_threadpool_release(struct threadpool *pool)
struct list pending_timers
static RTL_CRITICAL_SECTION_DEBUG timerqueue_debug
static struct threadpool_object * impl_from_TP_WORK(TP_WORK *work)
#define TIMER_QUEUE_MAGIC
static struct threadpool_object * impl_from_TP_WAIT(TP_WAIT *wait)
static BOOL object_is_finished(struct threadpool_object *object, BOOL group)
#define THREADPOOL_WORKER_TIMEOUT
VOID WINAPI TpCallbackSetEventOnCompletion(TP_CALLBACK_INSTANCE *instance, HANDLE event)
static void tp_ioqueue_unlock(struct threadpool_object *io)
static void CALLBACK threadpool_worker_proc(void *param)
static void tp_threadpool_unlock(struct threadpool *pool)
static void WINAPI timer_queue_thread_proc(LPVOID p)
static NTSTATUS tp_group_alloc(struct threadpool_group **out)
VOID WINAPI TpCallbackReleaseMutexOnCompletion(TP_CALLBACK_INSTANCE *instance, HANDLE mutex)
static struct timer_queue * get_timer_queue(HANDLE TimerQueue)
static struct @5305 old_threadpool
static void queue_destroy_timer(struct queue_timer *t)
static struct threadpool_instance * impl_from_TP_CALLBACK_INSTANCE(TP_CALLBACK_INSTANCE *instance)
static DWORD CALLBACK iocp_poller(LPVOID Arg)
static struct threadpool_object * impl_from_TP_TIMER(TP_TIMER *timer)
static NTSTATUS tp_alloc_wait(TP_WAIT **out, PTP_WAIT_CALLBACK callback, PVOID userdata, TP_CALLBACK_ENVIRON *environment, DWORD flags)
RTL_CONDITION_VARIABLE update_event
static struct threadpool_object * impl_from_TP_IO(TP_IO *io)
NTSTATUS WINAPI RtlDeleteTimerQueueEx(HANDLE TimerQueue, HANDLE CompletionEvent)
static NTSTATUS tp_ioqueue_lock(struct threadpool_object *io, HANDLE file)
static RTL_CRITICAL_SECTION_DEBUG critsect_compl_debug
static void CALLBACK timerqueue_thread_proc(void *param)
static void tp_object_execute(struct threadpool_object *object, BOOL wait_thread)
static void tp_timerqueue_unlock(struct threadpool_object *timer)
static struct @5308 ioqueue
static void CALLBACK waitqueue_thread_proc(void *param)
static RTL_CRITICAL_SECTION_DEBUG ioqueue_debug
static void tp_object_cancel(struct threadpool_object *object)
NTSTATUS WINAPI RtlUpdateTimer(HANDLE TimerQueue, HANDLE Timer, DWORD DueTime, DWORD Period)
static void timer_cleanup_callback(struct queue_timer *t)
VOID WINAPI TpCallbackLeaveCriticalSectionOnCompletion(TP_CALLBACK_INSTANCE *instance, CRITICAL_SECTION *crit)
static void queue_remove_timer(struct queue_timer *t)
static struct threadpool * impl_from_TP_POOL(TP_POOL *pool)
static void tp_threadpool_shutdown(struct threadpool *pool)
static void queue_timer_expire(struct timer_queue *q)
static void tp_object_prepare_shutdown(struct threadpool_object *object)
static NTSTATUS tp_timerqueue_lock(struct threadpool_object *timer)
static NTSTATUS tp_threadpool_lock(struct threadpool **out, TP_CALLBACK_ENVIRON *environment)
static void CALLBACK rtl_wait_callback(TP_CALLBACK_INSTANCE *instance, void *userdata, TP_WAIT *wait, TP_WAIT_RESULT result)
static void tp_object_prio_queue(struct threadpool_object *object)
NTSTATUS NTAPI NtReleaseSemaphore(IN HANDLE SemaphoreHandle, IN LONG ReleaseCount, OUT PLONG PreviousCount OPTIONAL)
namespace GUID const ADDRINFOEXW ADDRINFOEXW struct timeval OVERLAPPED * overlapped
INT WSAAPI shutdown(IN SOCKET s, IN INT how)
LIST_ENTRY ProcessLocksList
PTP_CLEANUP_GROUP CleanupGroup
union _TP_CALLBACK_ENVIRON_V3::@4519 u
PTP_SIMPLE_CALLBACK FinalizationCallback
TP_CALLBACK_PRIORITY CallbackPriority
PTP_CLEANUP_GROUP_CANCEL_CALLBACK CleanupGroupCancelCallback
struct _ACTIVATION_CONTEXT * ActivationContext
struct _TP_CALLBACK_ENVIRON_V3::@4519::@4520 s
RTL_WAITORTIMERCALLBACKFUNC callback
PRTL_WORK_ITEM_ROUTINE function
CRITICAL_SECTION * critical_section
struct threadpool_instance::@5315 cleanup
struct threadpool_object * object
PTP_WAIT_CALLBACK callback
PTP_SIMPLE_CALLBACK callback
PTP_CLEANUP_GROUP_CANCEL_CALLBACK group_cancel_callback
RTL_CONDITION_VARIABLE finished_event
TP_CALLBACK_PRIORITY priority
struct io_completion * completions
unsigned int skipped_count
union threadpool_object::@5309 u
enum threadpool_objtype type
struct threadpool_object::@5309::@5313 wait
struct threadpool_object::@5309::@5314 io
unsigned int completion_count
unsigned int completion_max
unsigned int pending_count
LONG num_associated_callbacks
RTL_WAITORTIMERCALLBACKFUNC rtl_callback
LONG num_running_callbacks
struct threadpool_object::@5309::@5310 simple
LONG num_pending_callbacks
PTP_WORK_CALLBACK callback
RTL_CONDITION_VARIABLE group_finished_event
struct threadpool_object::@5309::@5311 work
PTP_SIMPLE_CALLBACK finalization_callback
struct waitqueue_bucket * bucket
PTP_TIMER_CALLBACK callback
struct threadpool_group * group
struct threadpool_object::@5309::@5312 timer
TP_POOL_STACK_INFORMATION stack_info
RTL_CONDITION_VARIABLE update_event
#define STATUS_INVALID_PARAMETER
#define STATUS_UNSUCCESSFUL
static EFI_HANDLE * handles
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
_In_ WDFINTERRUPT _In_ PFN_WDF_INTERRUPT_SYNCHRONIZE Callback
_In_ WDFTIMER _In_ LONGLONG DueTime
HANDLE WINAPI GetCurrentThread(void)
DWORD WINAPI GetCurrentThreadId(void)
#define WT_TRANSFER_IMPERSONATION
@ TP_CALLBACK_PRIORITY_NORMAL
@ TP_CALLBACK_PRIORITY_HIGH
@ TP_CALLBACK_PRIORITY_LOW
struct _TP_CLEANUP_GROUP TP_CLEANUP_GROUP
VOID(NTAPI * PTP_WAIT_CALLBACK)(PTP_CALLBACK_INSTANCE, PVOID, PTP_WAIT, TP_WAIT_RESULT)
#define WT_EXECUTEINPERSISTENTTHREAD
struct _TP_CALLBACK_INSTANCE * PTP_CALLBACK_INSTANCE
#define WT_EXECUTEONLYONCE
#define WT_EXECUTEINIOTHREAD
#define RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO
#define WT_EXECUTELONGFUNCTION
#define WT_EXECUTEINWAITTHREAD
VOID(NTAPI * PTP_CLEANUP_GROUP_CANCEL_CALLBACK)(_Inout_opt_ PVOID ObjectContext, _Inout_opt_ PVOID CleanupContext)
VOID(NTAPI * PTP_WORK_CALLBACK)(_Inout_ PTP_CALLBACK_INSTANCE Instance, _Inout_opt_ PVOID Context, _Inout_ PTP_WORK Work)
#define WT_EXECUTEINTIMERTHREAD
enum _TP_CALLBACK_PRIORITY TP_CALLBACK_PRIORITY
struct _TP_TIMER TP_TIMER
VOID(NTAPI * PTP_SIMPLE_CALLBACK)(_Inout_ PTP_CALLBACK_INSTANCE Instance, _Inout_opt_ PVOID Context)
VOID(NTAPI * PTP_TIMER_CALLBACK)(PTP_CALLBACK_INSTANCE, PVOID, PTP_TIMER)
struct _TP_CALLBACK_INSTANCE TP_CALLBACK_INSTANCE
#define WT_EXECUTEDEFAULT
_Must_inspect_result_ _In_ ULONG Flags
_In_ LARGE_INTEGER _In_ ULONG Period
#define RTL_CONDITION_VARIABLE_INIT
_Inout_opt_ PVOID Parameter