|
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 */
|