FreeRDP
Loading...
Searching...
No Matches
callback_cleanup.c
1
20#include <winpr/config.h>
21
22#include <winpr/crt.h>
23#include <winpr/pool.h>
24#include <winpr/library.h>
25
26#include "pool.h"
27
28#ifdef WINPR_THREAD_POOL
29
30#ifdef _WIN32
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,
34 DWORD crel);
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);
40
41static BOOL CALLBACK init_module(PINIT_ONCE once, PVOID param, PVOID* context)
42{
43 HMODULE kernel32 = LoadLibraryA("kernel32.dll");
44 if (kernel32)
45 {
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*);
58 }
59 return TRUE;
60}
61#endif
62
63VOID SetEventWhenCallbackReturns(WINPR_ATTR_UNUSED PTP_CALLBACK_INSTANCE pci,
64 WINPR_ATTR_UNUSED HANDLE evt)
65{
66#ifdef _WIN32
67 if (!InitOnceExecuteOnce(&init_once_module, init_module, nullptr, nullptr))
68 return;
69 if (pSetEventWhenCallbackReturns)
70 {
71 pSetEventWhenCallbackReturns(pci, evt);
72 return;
73 }
74#endif
75 WLog_ERR("TODO", "TODO: implement");
76 /* No default implementation */
77}
78
79VOID ReleaseSemaphoreWhenCallbackReturns(WINPR_ATTR_UNUSED PTP_CALLBACK_INSTANCE pci,
80 WINPR_ATTR_UNUSED HANDLE sem, WINPR_ATTR_UNUSED DWORD crel)
81{
82#ifdef _WIN32
83 if (!InitOnceExecuteOnce(&init_once_module, init_module, nullptr, nullptr))
84 return;
85 if (pReleaseSemaphoreWhenCallbackReturns)
86 {
87 pReleaseSemaphoreWhenCallbackReturns(pci, sem, crel);
88 return;
89 }
90#endif
91 /* No default implementation */
92 WLog_ERR("TODO", "TODO: implement");
93}
94
95VOID ReleaseMutexWhenCallbackReturns(WINPR_ATTR_UNUSED PTP_CALLBACK_INSTANCE pci,
96 WINPR_ATTR_UNUSED HANDLE mut)
97{
98#ifdef _WIN32
99 if (!InitOnceExecuteOnce(&init_once_module, init_module, nullptr, nullptr))
100 return;
101 if (pReleaseMutexWhenCallbackReturns)
102 {
103 pReleaseMutexWhenCallbackReturns(pci, mut);
104 return;
105 }
106#endif
107 /* No default implementation */
108 WLog_ERR("TODO", "TODO: implement");
109}
110
111VOID LeaveCriticalSectionWhenCallbackReturns(WINPR_ATTR_UNUSED PTP_CALLBACK_INSTANCE pci,
112 WINPR_ATTR_UNUSED PCRITICAL_SECTION pcs)
113{
114#ifdef _WIN32
115 if (!InitOnceExecuteOnce(&init_once_module, init_module, nullptr, nullptr))
116 return;
117 if (pLeaveCriticalSectionWhenCallbackReturns)
118 {
119 pLeaveCriticalSectionWhenCallbackReturns(pci, pcs);
120 }
121#endif
122 /* No default implementation */
123 WLog_ERR("TODO", "TODO: implement");
124}
125
126VOID FreeLibraryWhenCallbackReturns(WINPR_ATTR_UNUSED PTP_CALLBACK_INSTANCE pci,
127 WINPR_ATTR_UNUSED HMODULE mod)
128{
129#ifdef _WIN32
130 if (!InitOnceExecuteOnce(&init_once_module, init_module, nullptr, nullptr))
131 return;
132 if (pFreeLibraryWhenCallbackReturns)
133 {
134 pFreeLibraryWhenCallbackReturns(pci, mod);
135 return;
136 }
137#endif
138 /* No default implementation */
139 WLog_ERR("TODO", "TODO: implement");
140}
141
142VOID DisassociateCurrentThreadFromCallback(WINPR_ATTR_UNUSED PTP_CALLBACK_INSTANCE pci)
143{
144#ifdef _WIN32
145 if (!InitOnceExecuteOnce(&init_once_module, init_module, nullptr, nullptr))
146 return;
147 if (pDisassociateCurrentThreadFromCallback)
148 {
149 pDisassociateCurrentThreadFromCallback(pci);
150 return;
151 }
152#endif
153 WLog_ERR("TODO", "TODO: implement");
154 /* No default implementation */
155}
156
157#endif /* WINPR_THREAD_POOL defined */