20#include <winpr/config.h>
23#include <winpr/pool.h>
24#include <winpr/library.h>
28#ifdef WINPR_THREAD_POOL
31static INIT_ONCE init_once_module = INIT_ONCE_STATIC_INIT;
32static VOID(WINAPI* pSetEventWhenCallbackReturns)(PTP_CALLBACK_INSTANCE pci, HANDLE evt);
33static VOID(WINAPI* pReleaseSemaphoreWhenCallbackReturns)(PTP_CALLBACK_INSTANCE pci, HANDLE sem,
35static VOID(WINAPI* pReleaseMutexWhenCallbackReturns)(PTP_CALLBACK_INSTANCE pci, HANDLE mut);
36static VOID(WINAPI* pLeaveCriticalSectionWhenCallbackReturns)(PTP_CALLBACK_INSTANCE pci,
38static VOID(WINAPI* pFreeLibraryWhenCallbackReturns)(PTP_CALLBACK_INSTANCE pci, HMODULE mod);
39static VOID(WINAPI* pDisassociateCurrentThreadFromCallback)(PTP_CALLBACK_INSTANCE pci);
41static BOOL CALLBACK init_module(
PINIT_ONCE once, PVOID param, PVOID* context)
43 HMODULE kernel32 = LoadLibraryA(
"kernel32.dll");
46 pSetEventWhenCallbackReturns =
47 GetProcAddressAs(kernel32,
"SetEventWhenCallbackReturns"),
void*);
48 pReleaseSemaphoreWhenCallbackReturns =
49 GetProcAddressAs(kernel32,
"ReleaseSemaphoreWhenCallbackReturns",
void*);
50 pReleaseMutexWhenCallbackReturns =
51 GetProcAddressAs(kernel32,
"ReleaseMutexWhenCallbackReturns",
void*);
52 pLeaveCriticalSectionWhenCallbackReturns =
53 GetProcAddressAs(kernel32,
"LeaveCriticalSectionWhenCallbackReturns",
void*);
54 pFreeLibraryWhenCallbackReturns =
55 GetProcAddressAs(kernel32,
"FreeLibraryWhenCallbackReturns",
void*);
56 pDisassociateCurrentThreadFromCallback =
57 GetProcAddressAs(kernel32,
"DisassociateCurrentThreadFromCallback",
void*);
63VOID SetEventWhenCallbackReturns(WINPR_ATTR_UNUSED PTP_CALLBACK_INSTANCE pci,
64 WINPR_ATTR_UNUSED HANDLE evt)
67 if (!InitOnceExecuteOnce(&init_once_module, init_module,
nullptr,
nullptr))
69 if (pSetEventWhenCallbackReturns)
71 pSetEventWhenCallbackReturns(pci, evt);
75 WLog_ERR(
"TODO",
"TODO: implement");
79VOID ReleaseSemaphoreWhenCallbackReturns(WINPR_ATTR_UNUSED PTP_CALLBACK_INSTANCE pci,
80 WINPR_ATTR_UNUSED HANDLE sem, WINPR_ATTR_UNUSED DWORD crel)
83 if (!InitOnceExecuteOnce(&init_once_module, init_module,
nullptr,
nullptr))
85 if (pReleaseSemaphoreWhenCallbackReturns)
87 pReleaseSemaphoreWhenCallbackReturns(pci, sem, crel);
92 WLog_ERR(
"TODO",
"TODO: implement");
95VOID ReleaseMutexWhenCallbackReturns(WINPR_ATTR_UNUSED PTP_CALLBACK_INSTANCE pci,
96 WINPR_ATTR_UNUSED HANDLE mut)
99 if (!InitOnceExecuteOnce(&init_once_module, init_module,
nullptr,
nullptr))
101 if (pReleaseMutexWhenCallbackReturns)
103 pReleaseMutexWhenCallbackReturns(pci, mut);
108 WLog_ERR(
"TODO",
"TODO: implement");
111VOID LeaveCriticalSectionWhenCallbackReturns(WINPR_ATTR_UNUSED PTP_CALLBACK_INSTANCE pci,
115 if (!InitOnceExecuteOnce(&init_once_module, init_module,
nullptr,
nullptr))
117 if (pLeaveCriticalSectionWhenCallbackReturns)
119 pLeaveCriticalSectionWhenCallbackReturns(pci, pcs);
123 WLog_ERR(
"TODO",
"TODO: implement");
126VOID FreeLibraryWhenCallbackReturns(WINPR_ATTR_UNUSED PTP_CALLBACK_INSTANCE pci,
127 WINPR_ATTR_UNUSED HMODULE mod)
130 if (!InitOnceExecuteOnce(&init_once_module, init_module,
nullptr,
nullptr))
132 if (pFreeLibraryWhenCallbackReturns)
134 pFreeLibraryWhenCallbackReturns(pci, mod);
139 WLog_ERR(
"TODO",
"TODO: implement");
142VOID DisassociateCurrentThreadFromCallback(WINPR_ATTR_UNUSED PTP_CALLBACK_INSTANCE pci)
145 if (!InitOnceExecuteOnce(&init_once_module, init_module,
nullptr,
nullptr))
147 if (pDisassociateCurrentThreadFromCallback)
149 pDisassociateCurrentThreadFromCallback(pci);
153 WLog_ERR(
"TODO",
"TODO: implement");