ReactOS 0.4.17-dev-684-ga6524ef
threadpool.c File Reference
#include "k32_vista.h"
Include dependency graph for threadpool.c:

Go to the source code of this file.

Typedefs

typedef void(CALLBACKPTP_IO_CALLBACK) (PTP_CALLBACK_INSTANCE, void *, void *, IO_STATUS_BLOCK *, PTP_IO)
 

Functions

BOOL WINAPI DECLSPEC_HOTPATCH TpSimpleTryPost (PTP_SIMPLE_CALLBACK callback, PVOID userdata, TP_CALLBACK_ENVIRON *environment)
 
NTSTATUS WINAPI TpAllocWork (TP_WORK **out, PTP_WORK_CALLBACK callback, PVOID userdata, TP_CALLBACK_ENVIRON *environment)
 
NTSTATUS WINAPI TpAllocCleanupGroup (TP_CLEANUP_GROUP **Group)
 
NTSTATUS WINAPI TpAllocWait (TP_WAIT **out, PTP_WAIT_CALLBACK callback, PVOID userdata, TP_CALLBACK_ENVIRON *environment)
 
NTSTATUS WINAPI TpAllocTimer (TP_TIMER **out, PTP_TIMER_CALLBACK callback, PVOID userdata, TP_CALLBACK_ENVIRON *environment)
 
NTSTATUS WINAPI TpAllocPool (TP_POOL **out, PVOID reserved)
 
NTSTATUS WINAPI TpAllocIoCompletion (TP_IO **out, HANDLE file, PTP_IO_CALLBACK callback, void *userdata, TP_CALLBACK_ENVIRON *environment)
 
PTP_TIMER WINAPI DECLSPEC_HOTPATCH CreateThreadpoolTimer (PTP_TIMER_CALLBACK callback, PVOID userdata, TP_CALLBACK_ENVIRON *environment)
 
static void WINAPI tp_io_callback (TP_CALLBACK_INSTANCE *instance, void *userdata, void *cvalue, IO_STATUS_BLOCK *iosb, TP_IO *io)
 
PTP_IO WINAPI DECLSPEC_HOTPATCH CreateThreadpoolIo (HANDLE handle, PTP_WIN32_IO_CALLBACK callback, PVOID userdata, TP_CALLBACK_ENVIRON *environment)
 
PTP_WAIT WINAPI DECLSPEC_HOTPATCH CreateThreadpoolWait (PTP_WAIT_CALLBACK callback, PVOID userdata, TP_CALLBACK_ENVIRON *environment)
 
PTP_WORK WINAPI DECLSPEC_HOTPATCH CreateThreadpoolWork (PTP_WORK_CALLBACK callback, PVOID userdata, TP_CALLBACK_ENVIRON *environment)
 
BOOL WINAPI DECLSPEC_HOTPATCH TrySubmitThreadpoolCallback (PTP_SIMPLE_CALLBACK callback, PVOID userdata, TP_CALLBACK_ENVIRON *environment)
 
PTP_CLEANUP_GROUP WINAPI DECLSPEC_HOTPATCH CreateThreadpoolCleanupGroup (void)
 
PTP_POOL WINAPI DECLSPEC_HOTPATCH CreateThreadpool (void *reserved)
 

Typedef Documentation

◆ PTP_IO_CALLBACK

typedef void(CALLBACK * PTP_IO_CALLBACK) (PTP_CALLBACK_INSTANCE, void *, void *, IO_STATUS_BLOCK *, PTP_IO)

Definition at line 3 of file threadpool.c.

Function Documentation

◆ CreateThreadpool()

PTP_POOL WINAPI DECLSPEC_HOTPATCH CreateThreadpool ( void reserved)

Definition at line 132 of file threadpool.c.

133{
134 TP_POOL *pool = NULL;
136
137 if (!NT_SUCCESS(status))
138 {
140 return NULL;
141 }
142 return pool;
143}
LONG NTSTATUS
Definition: precomp.h:26
#define NULL
Definition: types.h:112
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define SetLastError(x)
Definition: compat.h:752
NTSTATUS WINAPI TpAllocPool(TP_POOL **out, PVOID reserved)
Definition: threadpool.c:2588
r reserved
Definition: btrfs.c:3006
Definition: ps.c:97
NTSYSAPI ULONG WINAPI RtlNtStatusToDosError(NTSTATUS)
struct _TP_POOL TP_POOL
Definition: winnt_old.h:4754

Referenced by FxInterruptThreadpool::Initialize().

◆ CreateThreadpoolCleanupGroup()

PTP_CLEANUP_GROUP WINAPI DECLSPEC_HOTPATCH CreateThreadpoolCleanupGroup ( void  )

Definition at line 115 of file threadpool.c.

116{
119
120 if (!NT_SUCCESS(status))
121 {
123 return NULL;
124 }
125
126 return group;
127}
NTSTATUS WINAPI TpAllocCleanupGroup(TP_CLEANUP_GROUP **Group)
Definition: threadpool.c:2534
GLboolean GLuint group
Definition: glext.h:11120
struct _TP_CLEANUP_GROUP TP_CLEANUP_GROUP
Definition: winnt_old.h:4784

◆ CreateThreadpoolIo()

PTP_IO WINAPI DECLSPEC_HOTPATCH CreateThreadpoolIo ( HANDLE  handle,
PTP_WIN32_IO_CALLBACK  callback,
PVOID  userdata,
TP_CALLBACK_ENVIRON environment 
)

Definition at line 44 of file threadpool.c.

46{
47 TP_IO *io;
48
49 NTSTATUS status = TpAllocIoCompletion( &io, handle, tp_io_callback, userdata, environment );
50 *(void **)io = callback; /* ntdll leaves us space to store our callback at the beginning of TP_IO struct */
51 if (!NT_SUCCESS(status))
52 {
54 return FALSE;
55 }
56
57 return io;
58}
#define FALSE
Definition: types.h:117
static void WINAPI tp_io_callback(TP_CALLBACK_INSTANCE *instance, void *userdata, void *cvalue, IO_STATUS_BLOCK *iosb, TP_IO *io)
Definition: threadpool.c:35
NTSTATUS WINAPI TpAllocIoCompletion(TP_IO **out, HANDLE file, PTP_IO_CALLBACK callback, void *userdata, TP_CALLBACK_ENVIRON *environment)
Definition: threadpool.c:2544
static IPrintDialogCallback callback
Definition: printdlg.c:326
static HANDLE PIO_APC_ROUTINE PVOID PIO_STATUS_BLOCK io
Definition: file.c:72
struct _TP_IO TP_IO
Definition: winnt_old.h:4759

Referenced by init_threadpool().

◆ CreateThreadpoolTimer()

PTP_TIMER WINAPI DECLSPEC_HOTPATCH CreateThreadpoolTimer ( PTP_TIMER_CALLBACK  callback,
PVOID  userdata,
TP_CALLBACK_ENVIRON environment 
)

Definition at line 20 of file threadpool.c.

22{
23 TP_TIMER *timer;
24
25 NTSTATUS status = TpAllocTimer( &timer, callback, userdata, environment );
26 if (!NT_SUCCESS(status))
27 {
29 return FALSE;
30 }
31
32 return timer;
33}
NTSTATUS WINAPI TpAllocTimer(TP_TIMER **out, PTP_TIMER_CALLBACK callback, PVOID userdata, TP_CALLBACK_ENVIRON *environment)
Definition: threadpool.c:2601
struct _TP_TIMER TP_TIMER
Definition: winnt_old.h:4757

Referenced by _MdTimer::Initialize().

◆ CreateThreadpoolWait()

PTP_WAIT WINAPI DECLSPEC_HOTPATCH CreateThreadpoolWait ( PTP_WAIT_CALLBACK  callback,
PVOID  userdata,
TP_CALLBACK_ENVIRON environment 
)

Definition at line 63 of file threadpool.c.

65{
66 TP_WAIT *wait;
67
68 NTSTATUS status = TpAllocWait( &wait, callback, userdata, environment );
69 if (!NT_SUCCESS(status))
70 {
72 return FALSE;
73 }
74
75 return wait;
76}
NTSTATUS WINAPI TpAllocWait(TP_WAIT **out, PTP_WAIT_CALLBACK callback, PVOID userdata, TP_CALLBACK_ENVIRON *environment)
Definition: threadpool.c:2677
struct _TP_WAIT TP_WAIT
Definition: winnt_old.h:4758

◆ CreateThreadpoolWork()

PTP_WORK WINAPI DECLSPEC_HOTPATCH CreateThreadpoolWork ( PTP_WORK_CALLBACK  callback,
PVOID  userdata,
TP_CALLBACK_ENVIRON environment 
)

Definition at line 82 of file threadpool.c.

84{
85 TP_WORK *work;
86
87 NTSTATUS status = TpAllocWork( &work, callback, userdata, environment );
88 if (!NT_SUCCESS(status))
89 {
91 return FALSE;
92 }
93 return work;
94}
NTSTATUS WINAPI TpAllocWork(TP_WORK **out, PTP_WORK_CALLBACK callback, PVOID userdata, TP_CALLBACK_ENVIRON *environment)
Definition: threadpool.c:2687
struct _TP_WORK TP_WORK
Definition: winnt_old.h:4755

Referenced by _MdTimer::Initialize().

◆ tp_io_callback()

static void WINAPI tp_io_callback ( TP_CALLBACK_INSTANCE instance,
void userdata,
void cvalue,
IO_STATUS_BLOCK iosb,
TP_IO io 
)
static

Definition at line 35 of file threadpool.c.

36{
39}
static HINSTANCE instance
Definition: main.c:40
static PIO_STATUS_BLOCK iosb
Definition: file.c:70
VOID(WINAPI * PTP_WIN32_IO_CALLBACK)(_Inout_ PTP_CALLBACK_INSTANCE Instance, _Inout_opt_ PVOID Context, _Inout_opt_ PVOID Overlapped, _In_ ULONG IoResult, _In_ ULONG_PTR NumberOfBytesTransferred, _Inout_ PTP_IO Io)

Referenced by CreateThreadpoolIo().

◆ TpAllocCleanupGroup()

NTSTATUS WINAPI TpAllocCleanupGroup ( TP_CLEANUP_GROUP **  Group)

Definition at line 2534 of file threadpool.c.

2535{
2536 TRACE( "%p\n", out );
2537
2538 return tp_group_alloc( (struct threadpool_group **)out );
2539}
static NTSTATUS tp_group_alloc(struct threadpool_group **out)
Definition: threadpool.c:1960
#define TRACE(s)
Definition: solgame.cpp:4
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383

Referenced by CreateThreadpoolCleanupGroup(), and init_threadpool().

◆ TpAllocIoCompletion()

NTSTATUS WINAPI TpAllocIoCompletion ( TP_IO **  out,
HANDLE  file,
PTP_IO_CALLBACK  callback,
void userdata,
TP_CALLBACK_ENVIRON environment 
)

Definition at line 2544 of file threadpool.c.

2546{
2547 struct threadpool_object *object;
2548 struct threadpool *pool;
2550
2551 TRACE( "%p %p %p %p %p\n", out, file, callback, userdata, environment );
2552
2553 if (!(object = RtlAllocateHeap( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object) )))
2554 return STATUS_NO_MEMORY;
2555
2556 if ((status = tp_threadpool_lock( &pool, environment )))
2557 {
2558 RtlFreeHeap( GetProcessHeap(), 0, object );
2559 return status;
2560 }
2561
2562 object->type = TP_OBJECT_TYPE_IO;
2563 object->u.io.callback = callback;
2564 if (!(object->u.io.completions = RtlAllocateHeap( GetProcessHeap(), 0, 8 * sizeof(*object->u.io.completions) )))
2565 {
2567 RtlFreeHeap( GetProcessHeap(), 0, object );
2568 return status;
2569 }
2570
2571 if ((status = tp_ioqueue_lock( object, file )))
2572 {
2574 RtlFreeHeap( GetProcessHeap(), 0, object->u.io.completions );
2575 RtlFreeHeap( GetProcessHeap(), 0, object );
2576 return status;
2577 }
2578
2579 tp_object_initialize( object, pool, userdata, environment );
2580
2581 *out = (TP_IO *)object;
2582 return STATUS_SUCCESS;
2583}
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:616
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:634
#define STATUS_NO_MEMORY
Definition: d3dkmdt.h:51
#define GetProcessHeap()
Definition: compat.h:736
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
static void tp_object_initialize(struct threadpool_object *object, struct threadpool *pool, PVOID userdata, TP_CALLBACK_ENVIRON *environment)
Definition: threadpool.c:2026
@ TP_OBJECT_TYPE_IO
Definition: threadpool.c:167
static void tp_threadpool_unlock(struct threadpool *pool)
Definition: threadpool.c:1947
static NTSTATUS tp_ioqueue_lock(struct threadpool_object *io, HANDLE file)
Definition: threadpool.c:1724
static NTSTATUS tp_threadpool_lock(struct threadpool **out, TP_CALLBACK_ENVIRON *environment)
Definition: threadpool.c:1874
#define STATUS_SUCCESS
Definition: shellext.h:65
Definition: fci.c:127

Referenced by CreateThreadpoolIo(), and init_threadpool().

◆ TpAllocPool()

NTSTATUS WINAPI TpAllocPool ( TP_POOL **  out,
PVOID  reserved 
)

Definition at line 2588 of file threadpool.c.

2589{
2590 TRACE( "%p %p\n", out, reserved );
2591
2592 if (reserved)
2593 FIXME( "reserved argument is nonzero (%p)\n", reserved );
2594
2595 return tp_threadpool_alloc( (struct threadpool **)out );
2596}
#define FIXME(fmt,...)
Definition: precomp.h:53
static NTSTATUS tp_threadpool_alloc(struct threadpool **out)
Definition: threadpool.c:1782

Referenced by CreateThreadpool(), and init_threadpool().

◆ TpAllocTimer()

NTSTATUS WINAPI TpAllocTimer ( TP_TIMER **  out,
PTP_TIMER_CALLBACK  callback,
PVOID  userdata,
TP_CALLBACK_ENVIRON environment 
)

Definition at line 2601 of file threadpool.c.

2603{
2604 struct threadpool_object *object;
2605 struct threadpool *pool;
2607
2608 TRACE( "%p %p %p %p\n", out, callback, userdata, environment );
2609
2610 object = RtlAllocateHeap( GetProcessHeap(), 0, sizeof(*object) );
2611 if (!object)
2612 return STATUS_NO_MEMORY;
2613
2614 status = tp_threadpool_lock( &pool, environment );
2615 if (status)
2616 {
2617 RtlFreeHeap( GetProcessHeap(), 0, object );
2618 return status;
2619 }
2620
2621 object->type = TP_OBJECT_TYPE_TIMER;
2622 object->u.timer.callback = callback;
2623
2624 status = tp_timerqueue_lock( object );
2625 if (status)
2626 {
2628 RtlFreeHeap( GetProcessHeap(), 0, object );
2629 return status;
2630 }
2631
2632 tp_object_initialize( object, pool, userdata, environment );
2633
2634 *out = (TP_TIMER *)object;
2635 return STATUS_SUCCESS;
2636}
@ TP_OBJECT_TYPE_TIMER
Definition: threadpool.c:165
static NTSTATUS tp_timerqueue_lock(struct threadpool_object *timer)
Definition: threadpool.c:1265

Referenced by CreateThreadpoolTimer(), and init_threadpool().

◆ TpAllocWait()

NTSTATUS WINAPI TpAllocWait ( TP_WAIT **  out,
PTP_WAIT_CALLBACK  callback,
PVOID  userdata,
TP_CALLBACK_ENVIRON environment 
)

Definition at line 2677 of file threadpool.c.

2679{
2680 TRACE( "%p %p %p %p\n", out, callback, userdata, environment );
2681 return tp_alloc_wait( out, callback, userdata, environment, WT_EXECUTEONLYONCE );
2682}
static NTSTATUS tp_alloc_wait(TP_WAIT **out, PTP_WAIT_CALLBACK callback, PVOID userdata, TP_CALLBACK_ENVIRON *environment, DWORD flags)
Definition: threadpool.c:2638
#define WT_EXECUTEONLYONCE
Definition: winnt_old.h:1100

Referenced by CreateThreadpoolWait(), and init_threadpool().

◆ TpAllocWork()

NTSTATUS WINAPI TpAllocWork ( TP_WORK **  out,
PTP_WORK_CALLBACK  callback,
PVOID  userdata,
TP_CALLBACK_ENVIRON environment 
)

Definition at line 2687 of file threadpool.c.

2689{
2690 struct threadpool_object *object;
2691 struct threadpool *pool;
2693
2694 TRACE( "%p %p %p %p\n", out, callback, userdata, environment );
2695
2696 object = RtlAllocateHeap( GetProcessHeap(), 0, sizeof(*object) );
2697 if (!object)
2698 return STATUS_NO_MEMORY;
2699
2700 status = tp_threadpool_lock( &pool, environment );
2701 if (status)
2702 {
2703 RtlFreeHeap( GetProcessHeap(), 0, object );
2704 return status;
2705 }
2706
2707 object->type = TP_OBJECT_TYPE_WORK;
2708 object->u.work.callback = callback;
2709 tp_object_initialize( object, pool, userdata, environment );
2710
2711 *out = (TP_WORK *)object;
2712 return STATUS_SUCCESS;
2713}
@ TP_OBJECT_TYPE_WORK
Definition: threadpool.c:164

Referenced by CreateThreadpoolWork(), and init_threadpool().

◆ TpSimpleTryPost()

BOOL WINAPI DECLSPEC_HOTPATCH TpSimpleTryPost ( PTP_SIMPLE_CALLBACK  callback,
PVOID  userdata,
TP_CALLBACK_ENVIRON environment 
)

Definition at line 3243 of file threadpool.c.

3245{
3246 struct threadpool_object *object;
3247 struct threadpool *pool;
3249
3250 TRACE( "%p %p %p\n", callback, userdata, environment );
3251
3252 object = RtlAllocateHeap( GetProcessHeap(), 0, sizeof(*object) );
3253 if (!object)
3254 return STATUS_NO_MEMORY;
3255
3256 status = tp_threadpool_lock( &pool, environment );
3257 if (status)
3258 {
3259 RtlFreeHeap( GetProcessHeap(), 0, object );
3260 return status;
3261 }
3262
3263 object->type = TP_OBJECT_TYPE_SIMPLE;
3264 object->u.simple.callback = callback;
3265 tp_object_initialize( object, pool, userdata, environment );
3266
3267 return STATUS_SUCCESS;
3268}
@ TP_OBJECT_TYPE_SIMPLE
Definition: threadpool.c:163

Referenced by init_threadpool(), RtlQueueWorkItem(), and TrySubmitThreadpoolCallback().

◆ TrySubmitThreadpoolCallback()

BOOL WINAPI DECLSPEC_HOTPATCH TrySubmitThreadpoolCallback ( PTP_SIMPLE_CALLBACK  callback,
PVOID  userdata,
TP_CALLBACK_ENVIRON environment 
)

Definition at line 99 of file threadpool.c.

101{
102 NTSTATUS status = TpSimpleTryPost( callback, userdata, environment );
103 if (!NT_SUCCESS(status))
104 {
106 return FALSE;
107 }
108
109 return TRUE;
110}
#define TRUE
Definition: types.h:120
BOOL WINAPI DECLSPEC_HOTPATCH TpSimpleTryPost(PTP_SIMPLE_CALLBACK callback, PVOID userdata, TP_CALLBACK_ENVIRON *environment)
Definition: threadpool.c:3243

Referenced by cache_connection(), netconn_resolve(), queue_task(), and winhttp_request_Send().