Blame winpr/include/winpr/pool.h

Packit Service fa4841
/**
Packit Service fa4841
 * WinPR: Windows Portable Runtime
Packit Service fa4841
 * Thread Pool API
Packit Service fa4841
 *
Packit Service fa4841
 * Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
Packit Service fa4841
 *
Packit Service fa4841
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit Service fa4841
 * you may not use this file except in compliance with the License.
Packit Service fa4841
 * You may obtain a copy of the License at
Packit Service fa4841
 *
Packit Service fa4841
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit Service fa4841
 *
Packit Service fa4841
 * Unless required by applicable law or agreed to in writing, software
Packit Service fa4841
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit Service fa4841
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit Service fa4841
 * See the License for the specific language governing permissions and
Packit Service fa4841
 * limitations under the License.
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
#ifndef WINPR_POOL_H
Packit Service fa4841
#define WINPR_POOL_H
Packit Service fa4841
Packit Service fa4841
#include <winpr/winpr.h>
Packit Service fa4841
#include <winpr/wtypes.h>
Packit Service fa4841
Packit Service fa4841
#include <winpr/synch.h>
Packit Service fa4841
#include <winpr/thread.h>
Packit Service fa4841
Packit Service fa4841
#ifndef _WIN32
Packit Service fa4841
Packit Service fa4841
typedef DWORD TP_VERSION, *PTP_VERSION;
Packit Service fa4841
Packit Service fa4841
typedef struct _TP_CALLBACK_INSTANCE TP_CALLBACK_INSTANCE, *PTP_CALLBACK_INSTANCE;
Packit Service fa4841
Packit Service fa4841
typedef VOID (*PTP_SIMPLE_CALLBACK)(PTP_CALLBACK_INSTANCE Instance, PVOID Context);
Packit Service fa4841
Packit Service fa4841
typedef struct _TP_POOL TP_POOL, *PTP_POOL;
Packit Service fa4841
Packit Service fa4841
typedef struct _TP_POOL_STACK_INFORMATION
Packit Service fa4841
{
Packit Service fa4841
	SIZE_T StackReserve;
Packit Service fa4841
	SIZE_T StackCommit;
Packit Service fa4841
} TP_POOL_STACK_INFORMATION, *PTP_POOL_STACK_INFORMATION;
Packit Service fa4841
Packit Service fa4841
typedef struct _TP_CLEANUP_GROUP TP_CLEANUP_GROUP, *PTP_CLEANUP_GROUP;
Packit Service fa4841
Packit Service fa4841
typedef VOID (*PTP_CLEANUP_GROUP_CANCEL_CALLBACK)(PVOID ObjectContext, PVOID CleanupContext);
Packit Service fa4841
Packit Service fa4841
typedef struct _TP_CALLBACK_ENVIRON_V1
Packit Service fa4841
{
Packit Service fa4841
	TP_VERSION Version;
Packit Service fa4841
	PTP_POOL Pool;
Packit Service fa4841
	PTP_CLEANUP_GROUP CleanupGroup;
Packit Service fa4841
	PTP_CLEANUP_GROUP_CANCEL_CALLBACK CleanupGroupCancelCallback;
Packit Service fa4841
	PVOID RaceDll;
Packit Service fa4841
	struct _ACTIVATION_CONTEXT* ActivationContext;
Packit Service fa4841
	PTP_SIMPLE_CALLBACK FinalizationCallback;
Packit Service fa4841
Packit Service bb5c11
	union
Packit Service bb5c11
	{
Packit Service fa4841
		DWORD Flags;
Packit Service fa4841
		struct
Packit Service fa4841
		{
Packit Service bb5c11
			DWORD LongFunction: 1;
Packit Service bb5c11
			DWORD Persistent: 1;
Packit Service bb5c11
			DWORD Private: 30;
Packit Service fa4841
		} s;
Packit Service fa4841
	} u;
Packit Service fa4841
} TP_CALLBACK_ENVIRON_V1;
Packit Service fa4841
Packit Service fa4841
typedef TP_CALLBACK_ENVIRON_V1 TP_CALLBACK_ENVIRON, *PTP_CALLBACK_ENVIRON;
Packit Service fa4841
Packit Service fa4841
#endif /* _WIN32 not defined */
Packit Service fa4841
Packit Service fa4841
typedef struct _TP_WORK TP_WORK, *PTP_WORK;
Packit Service fa4841
typedef struct _TP_TIMER TP_TIMER, *PTP_TIMER;
Packit Service fa4841
Packit Service fa4841
typedef DWORD TP_WAIT_RESULT;
Packit Service fa4841
typedef struct _TP_WAIT TP_WAIT, *PTP_WAIT;
Packit Service fa4841
Packit Service fa4841
typedef struct _TP_IO TP_IO, *PTP_IO;
Packit Service fa4841
Packit Service bb5c11
Packit Service fa4841
#ifndef _WIN32
Packit Service fa4841
Packit Service fa4841
typedef VOID (*PTP_WORK_CALLBACK)(PTP_CALLBACK_INSTANCE Instance, PVOID Context, PTP_WORK Work);
Packit Service fa4841
typedef VOID (*PTP_TIMER_CALLBACK)(PTP_CALLBACK_INSTANCE Instance, PVOID Context, PTP_TIMER Timer);
Packit Service fa4841
typedef VOID (*PTP_WAIT_CALLBACK)(PTP_CALLBACK_INSTANCE Instance, PVOID Context, PTP_WAIT Wait,
Packit Service fa4841
                                  TP_WAIT_RESULT WaitResult);
Packit Service fa4841
Packit Service fa4841
#endif
Packit Service fa4841
Packit Service fa4841
/*
Packit Service fa4841
There is a bug in the Win8 header that defines the IO
Packit Service fa4841
callback unconditionally. Versions of Windows greater
Packit Service fa4841
than XP will conditionally define it. The following
Packit Service fa4841
logic tries to fix that.
Packit Service fa4841
*/
Packit Service fa4841
#ifdef _THREADPOOLAPISET_H_
Packit Service fa4841
#define PTP_WIN32_IO_CALLBACK_DEFINED 1
Packit Service fa4841
#else
Packit Service fa4841
#if (_WIN32_WINNT >= 0x0600)
Packit Service fa4841
#define PTP_WIN32_IO_CALLBACK_DEFINED 1
Packit Service fa4841
#endif
Packit Service fa4841
#endif
Packit Service fa4841
Packit Service fa4841
#ifndef PTP_WIN32_IO_CALLBACK_DEFINED
Packit Service fa4841
Packit Service fa4841
typedef VOID (*PTP_WIN32_IO_CALLBACK)(PTP_CALLBACK_INSTANCE Instance, PVOID Context,
Packit Service bb5c11
                                      PVOID Overlapped,
Packit Service bb5c11
                                      ULONG IoResult, ULONG_PTR NumberOfBytesTransferred, PTP_IO Io);
Packit Service fa4841
Packit Service fa4841
#endif
Packit Service fa4841
Packit Service fa4841
#if (!defined(_WIN32) || ((defined(_WIN32) && (_WIN32_WINNT < 0x0600))))
Packit Service bb5c11
#define WINPR_THREAD_POOL	1
Packit Service fa4841
#endif
Packit Service fa4841
Packit Service fa4841
#ifdef __cplusplus
Packit Service bb5c11
extern "C" {
Packit Service fa4841
#endif
Packit Service fa4841
Packit Service bb5c11
/* Synch */
Packit Service fa4841
Packit Service fa4841
#ifdef WINPR_THREAD_POOL
Packit Service fa4841
Packit Service bb5c11
WINPR_API PTP_WAIT winpr_CreateThreadpoolWait(PTP_WAIT_CALLBACK pfnwa, PVOID pv,
Packit Service bb5c11
        PTP_CALLBACK_ENVIRON pcbe);
Packit Service bb5c11
WINPR_API VOID winpr_CloseThreadpoolWait(PTP_WAIT pwa);
Packit Service bb5c11
WINPR_API VOID winpr_SetThreadpoolWait(PTP_WAIT pwa, HANDLE h, PFILETIME pftTimeout);
Packit Service bb5c11
WINPR_API VOID winpr_WaitForThreadpoolWaitCallbacks(PTP_WAIT pwa, BOOL fCancelPendingCallbacks);
Packit Service fa4841
Packit Service fa4841
#define CreateThreadpoolWait winpr_CreateThreadpoolWait
Packit Service fa4841
#define CloseThreadpoolWait winpr_CloseThreadpoolWait
Packit Service fa4841
#define SetThreadpoolWait winpr_SetThreadpoolWait
Packit Service fa4841
#define WaitForThreadpoolWaitCallbacks winpr_WaitForThreadpoolWaitCallbacks
Packit Service fa4841
Packit Service bb5c11
/* Work */
Packit Service fa4841
Packit Service bb5c11
WINPR_API PTP_WORK winpr_CreateThreadpoolWork(PTP_WORK_CALLBACK pfnwk, PVOID pv,
Packit Service bb5c11
        PTP_CALLBACK_ENVIRON pcbe);
Packit Service bb5c11
WINPR_API VOID winpr_CloseThreadpoolWork(PTP_WORK pwk);
Packit Service bb5c11
WINPR_API VOID winpr_SubmitThreadpoolWork(PTP_WORK pwk);
Packit Service bb5c11
WINPR_API BOOL winpr_TrySubmitThreadpoolCallback(PTP_SIMPLE_CALLBACK pfns, PVOID pv,
Packit Service bb5c11
        PTP_CALLBACK_ENVIRON pcbe);
Packit Service bb5c11
WINPR_API VOID winpr_WaitForThreadpoolWorkCallbacks(PTP_WORK pwk, BOOL fCancelPendingCallbacks);
Packit Service fa4841
Packit Service fa4841
#define CreateThreadpoolWork winpr_CreateThreadpoolWork
Packit Service fa4841
#define CloseThreadpoolWork winpr_CloseThreadpoolWork
Packit Service fa4841
#define SubmitThreadpoolWork winpr_SubmitThreadpoolWork
Packit Service fa4841
#define TrySubmitThreadpoolCallback winpr_TrySubmitThreadpoolCallback
Packit Service fa4841
#define WaitForThreadpoolWorkCallbacks winpr_WaitForThreadpoolWorkCallbacks
Packit Service fa4841
Packit Service bb5c11
/* Timer */
Packit Service fa4841
Packit Service bb5c11
WINPR_API PTP_TIMER winpr_CreateThreadpoolTimer(PTP_TIMER_CALLBACK pfnti, PVOID pv,
Packit Service bb5c11
        PTP_CALLBACK_ENVIRON pcbe);
Packit Service bb5c11
WINPR_API VOID winpr_CloseThreadpoolTimer(PTP_TIMER pti);
Packit Service bb5c11
WINPR_API BOOL winpr_IsThreadpoolTimerSet(PTP_TIMER pti);
Packit Service bb5c11
WINPR_API VOID winpr_SetThreadpoolTimer(PTP_TIMER pti, PFILETIME pftDueTime, DWORD msPeriod,
Packit Service bb5c11
                                        DWORD msWindowLength);
Packit Service bb5c11
WINPR_API VOID winpr_WaitForThreadpoolTimerCallbacks(PTP_TIMER pti, BOOL fCancelPendingCallbacks);
Packit Service fa4841
Packit Service fa4841
#define CreateThreadpoolTimer winpr_CreateThreadpoolTimer
Packit Service fa4841
#define CloseThreadpoolTimer winpr_CloseThreadpoolTimer
Packit Service fa4841
#define IsThreadpoolTimerSet winpr_IsThreadpoolTimerSet
Packit Service fa4841
#define SetThreadpoolTimer winpr_SetThreadpoolTimer
Packit Service fa4841
#define WaitForThreadpoolTimerCallbacks winpr_WaitForThreadpoolTimerCallbacks
Packit Service fa4841
Packit Service bb5c11
/* I/O */
Packit Service fa4841
Packit Service bb5c11
WINPR_API PTP_IO winpr_CreateThreadpoolIo(HANDLE fl, PTP_WIN32_IO_CALLBACK pfnio, PVOID pv,
Packit Service bb5c11
        PTP_CALLBACK_ENVIRON pcbe);
Packit Service bb5c11
WINPR_API VOID winpr_CloseThreadpoolIo(PTP_IO pio);
Packit Service bb5c11
WINPR_API VOID winpr_StartThreadpoolIo(PTP_IO pio);
Packit Service bb5c11
WINPR_API VOID winpr_CancelThreadpoolIo(PTP_IO pio);
Packit Service bb5c11
WINPR_API VOID winpr_WaitForThreadpoolIoCallbacks(PTP_IO pio, BOOL fCancelPendingCallbacks);
Packit Service fa4841
Packit Service fa4841
#define CreateThreadpoolIo winpr_CreateThreadpoolIo
Packit Service fa4841
#define CloseThreadpoolIo winpr_CloseThreadpoolIo
Packit Service fa4841
#define StartThreadpoolIo winpr_StartThreadpoolIo
Packit Service fa4841
#define CancelThreadpoolIo winpr_CancelThreadpoolIo
Packit Service fa4841
#define WaitForThreadpoolIoCallbacks winpr_WaitForThreadpoolIoCallbacks
Packit Service fa4841
Packit Service bb5c11
/* Clean-up Group */
Packit Service fa4841
Packit Service bb5c11
WINPR_API VOID winpr_SetThreadpoolCallbackCleanupGroup(PTP_CALLBACK_ENVIRON pcbe, PTP_CLEANUP_GROUP ptpcg,
Packit Service bb5c11
                                       PTP_CLEANUP_GROUP_CANCEL_CALLBACK pfng);
Packit Service bb5c11
WINPR_API PTP_CLEANUP_GROUP winpr_CreateThreadpoolCleanupGroup(void);
Packit Service bb5c11
WINPR_API VOID winpr_CloseThreadpoolCleanupGroupMembers(PTP_CLEANUP_GROUP ptpcg,
Packit Service bb5c11
        BOOL fCancelPendingCallbacks, PVOID pvCleanupContext);
Packit Service bb5c11
WINPR_API VOID winpr_CloseThreadpoolCleanupGroup(PTP_CLEANUP_GROUP ptpcg);
Packit Service fa4841
Packit Service fa4841
#define SetThreadpoolCallbackCleanupGroup winpr_SetThreadpoolCallbackCleanupGroup
Packit Service fa4841
#define CreateThreadpoolCleanupGroup winpr_CreateThreadpoolCleanupGroup
Packit Service fa4841
#define CloseThreadpoolCleanupGroupMembers winpr_CloseThreadpoolCleanupGroupMembers
Packit Service fa4841
#define CloseThreadpoolCleanupGroup winpr_CloseThreadpoolCleanupGroup
Packit Service fa4841
Packit Service bb5c11
/* Pool */
Packit Service fa4841
Packit Service bb5c11
WINPR_API PTP_POOL winpr_CreateThreadpool(PVOID reserved);
Packit Service bb5c11
WINPR_API VOID winpr_CloseThreadpool(PTP_POOL ptpp);
Packit Service bb5c11
WINPR_API BOOL winpr_SetThreadpoolThreadMinimum(PTP_POOL ptpp, DWORD cthrdMic);
Packit Service bb5c11
WINPR_API VOID winpr_SetThreadpoolThreadMaximum(PTP_POOL ptpp, DWORD cthrdMost);
Packit Service fa4841
Packit Service fa4841
#define CreateThreadpool winpr_CreateThreadpool
Packit Service fa4841
#define CloseThreadpool winpr_CloseThreadpool
Packit Service fa4841
#define SetThreadpoolThreadMinimum winpr_SetThreadpoolThreadMinimum
Packit Service fa4841
#define SetThreadpoolThreadMaximum winpr_SetThreadpoolThreadMaximum
Packit Service fa4841
Packit Service bb5c11
/* Callback Environment */
Packit Service fa4841
Packit Service bb5c11
static INLINE VOID InitializeThreadpoolEnvironment(PTP_CALLBACK_ENVIRON pcbe)
Packit Service bb5c11
{
Packit Service bb5c11
	pcbe->Version = 1;
Packit Service bb5c11
	pcbe->Pool = NULL;
Packit Service bb5c11
	pcbe->CleanupGroup = NULL;
Packit Service bb5c11
	pcbe->CleanupGroupCancelCallback = NULL;
Packit Service bb5c11
	pcbe->RaceDll = NULL;
Packit Service bb5c11
	pcbe->ActivationContext = NULL;
Packit Service bb5c11
	pcbe->FinalizationCallback = NULL;
Packit Service bb5c11
	pcbe->u.Flags = 0;
Packit Service bb5c11
}
Packit Service fa4841
Packit Service bb5c11
static INLINE VOID DestroyThreadpoolEnvironment(PTP_CALLBACK_ENVIRON pcbe)
Packit Service bb5c11
{
Packit Service bb5c11
	/* no actions, this may change in a future release. */
Packit Service bb5c11
}
Packit Service fa4841
Packit Service bb5c11
static INLINE VOID SetThreadpoolCallbackPool(PTP_CALLBACK_ENVIRON pcbe, PTP_POOL ptpp)
Packit Service bb5c11
{
Packit Service bb5c11
	pcbe->Pool = ptpp;
Packit Service bb5c11
}
Packit Service bb5c11
Packit Service bb5c11
static INLINE VOID SetThreadpoolCallbackRunsLong(PTP_CALLBACK_ENVIRON pcbe)
Packit Service bb5c11
{
Packit Service bb5c11
	pcbe->u.s.LongFunction = 1;
Packit Service bb5c11
}
Packit Service bb5c11
Packit Service bb5c11
static INLINE VOID SetThreadpoolCallbackLibrary(PTP_CALLBACK_ENVIRON pcbe, PVOID mod)
Packit Service bb5c11
{
Packit Service bb5c11
	pcbe->RaceDll = mod;
Packit Service bb5c11
}
Packit Service fa4841
Packit Service fa4841
Packit Service bb5c11
/* Callback */
Packit Service fa4841
Packit Service bb5c11
WINPR_API BOOL winpr_CallbackMayRunLong(PTP_CALLBACK_INSTANCE pci);
Packit Service fa4841
Packit Service bb5c11
/* Callback Clean-up */
Packit Service fa4841
Packit Service bb5c11
WINPR_API VOID winpr_SetEventWhenCallbackReturns(PTP_CALLBACK_INSTANCE pci, HANDLE evt);
Packit Service bb5c11
WINPR_API VOID winpr_ReleaseSemaphoreWhenCallbackReturns(PTP_CALLBACK_INSTANCE pci, HANDLE sem,
Packit Service bb5c11
        DWORD crel);
Packit Service bb5c11
WINPR_API VOID winpr_ReleaseMutexWhenCallbackReturns(PTP_CALLBACK_INSTANCE pci, HANDLE mut);
Packit Service bb5c11
WINPR_API VOID winpr_LeaveCriticalSectionWhenCallbackReturns(PTP_CALLBACK_INSTANCE pci,
Packit Service bb5c11
        PCRITICAL_SECTION pcs);
Packit Service bb5c11
WINPR_API VOID winpr_FreeLibraryWhenCallbackReturns(PTP_CALLBACK_INSTANCE pci, HMODULE mod);
Packit Service bb5c11
WINPR_API VOID winpr_DisassociateCurrentThreadFromCallback(PTP_CALLBACK_INSTANCE pci);
Packit Service fa4841
Packit Service fa4841
#define SetEventWhenCallbackReturns winpr_SetEventWhenCallbackReturns
Packit Service fa4841
#define ReleaseSemaphoreWhenCallbackReturns winpr_ReleaseSemaphoreWhenCallbackReturns
Packit Service fa4841
#define ReleaseMutexWhenCallbackReturns winpr_ReleaseMutexWhenCallbackReturns
Packit Service fa4841
#define LeaveCriticalSectionWhenCallbackReturns winpr_LeaveCriticalSectionWhenCallbackReturns
Packit Service fa4841
#define FreeLibraryWhenCallbackReturns winpr_FreeLibraryWhenCallbackReturns
Packit Service fa4841
#define DisassociateCurrentThreadFromCallback winpr_DisassociateCurrentThreadFromCallback
Packit Service fa4841
Packit Service fa4841
#endif
Packit Service fa4841
Packit Service fa4841
#ifdef __cplusplus
Packit Service fa4841
}
Packit Service fa4841
#endif
Packit Service fa4841
Packit Service fa4841
#endif /* WINPR_POOL_H */