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 InitOnceExecuteOnce(&init_once_module, init_module, NULL, NULL);
68 if (pSetEventWhenCallbackReturns)
70 pSetEventWhenCallbackReturns(pci, evt);
74 WLog_ERR(
"TODO",
"TODO: implement");
78VOID ReleaseSemaphoreWhenCallbackReturns(WINPR_ATTR_UNUSED PTP_CALLBACK_INSTANCE pci,
79 WINPR_ATTR_UNUSED HANDLE sem, WINPR_ATTR_UNUSED DWORD crel)
82 InitOnceExecuteOnce(&init_once_module, init_module, NULL, NULL);
83 if (pReleaseSemaphoreWhenCallbackReturns)
85 pReleaseSemaphoreWhenCallbackReturns(pci, sem, crel);
90 WLog_ERR(
"TODO",
"TODO: implement");
93VOID ReleaseMutexWhenCallbackReturns(WINPR_ATTR_UNUSED PTP_CALLBACK_INSTANCE pci,
94 WINPR_ATTR_UNUSED HANDLE mut)
97 InitOnceExecuteOnce(&init_once_module, init_module, NULL, NULL);
98 if (pReleaseMutexWhenCallbackReturns)
100 pReleaseMutexWhenCallbackReturns(pci, mut);
105 WLog_ERR(
"TODO",
"TODO: implement");
108VOID LeaveCriticalSectionWhenCallbackReturns(WINPR_ATTR_UNUSED PTP_CALLBACK_INSTANCE pci,
112 InitOnceExecuteOnce(&init_once_module, init_module, NULL, NULL);
113 if (pLeaveCriticalSectionWhenCallbackReturns)
115 pLeaveCriticalSectionWhenCallbackReturns(pci, pcs);
119 WLog_ERR(
"TODO",
"TODO: implement");
122VOID FreeLibraryWhenCallbackReturns(WINPR_ATTR_UNUSED PTP_CALLBACK_INSTANCE pci,
123 WINPR_ATTR_UNUSED HMODULE mod)
126 InitOnceExecuteOnce(&init_once_module, init_module, NULL, NULL);
127 if (pFreeLibraryWhenCallbackReturns)
129 pFreeLibraryWhenCallbackReturns(pci, mod);
134 WLog_ERR(
"TODO",
"TODO: implement");
137VOID DisassociateCurrentThreadFromCallback(WINPR_ATTR_UNUSED PTP_CALLBACK_INSTANCE pci)
140 InitOnceExecuteOnce(&init_once_module, init_module, NULL, NULL);
141 if (pDisassociateCurrentThreadFromCallback)
143 pDisassociateCurrentThreadFromCallback(pci);
147 WLog_ERR(
"TODO",
"TODO: implement");