Blame winpr/include/winpr/pool.h

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