FreeRDP
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Modules Pages
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 InitOnceExecuteOnce(&init_once_module, init_module, NULL, NULL);
68 if (pSetEventWhenCallbackReturns)
69 {
70 pSetEventWhenCallbackReturns(pci, evt);
71 return;
72 }
73#endif
74 WLog_ERR("TODO", "TODO: implement");
75 /* No default implementation */
76}
77
78VOID ReleaseSemaphoreWhenCallbackReturns(WINPR_ATTR_UNUSED PTP_CALLBACK_INSTANCE pci,
79 WINPR_ATTR_UNUSED HANDLE sem, WINPR_ATTR_UNUSED DWORD crel)
80{
81#ifdef _WIN32
82 InitOnceExecuteOnce(&init_once_module, init_module, NULL, NULL);
83 if (pReleaseSemaphoreWhenCallbackReturns)
84 {
85 pReleaseSemaphoreWhenCallbackReturns(pci, sem, crel);
86 return;
87 }
88#endif
89 /* No default implementation */
90 WLog_ERR("TODO", "TODO: implement");
91}
92
93VOID ReleaseMutexWhenCallbackReturns(WINPR_ATTR_UNUSED PTP_CALLBACK_INSTANCE pci,
94 WINPR_ATTR_UNUSED HANDLE mut)
95{
96#ifdef _WIN32
97 InitOnceExecuteOnce(&init_once_module, init_module, NULL, NULL);
98 if (pReleaseMutexWhenCallbackReturns)
99 {
100 pReleaseMutexWhenCallbackReturns(pci, mut);
101 return;
102 }
103#endif
104 /* No default implementation */
105 WLog_ERR("TODO", "TODO: implement");
106}
107
108VOID LeaveCriticalSectionWhenCallbackReturns(WINPR_ATTR_UNUSED PTP_CALLBACK_INSTANCE pci,
109 WINPR_ATTR_UNUSED PCRITICAL_SECTION pcs)
110{
111#ifdef _WIN32
112 InitOnceExecuteOnce(&init_once_module, init_module, NULL, NULL);
113 if (pLeaveCriticalSectionWhenCallbackReturns)
114 {
115 pLeaveCriticalSectionWhenCallbackReturns(pci, pcs);
116 }
117#endif
118 /* No default implementation */
119 WLog_ERR("TODO", "TODO: implement");
120}
121
122VOID FreeLibraryWhenCallbackReturns(WINPR_ATTR_UNUSED PTP_CALLBACK_INSTANCE pci,
123 WINPR_ATTR_UNUSED HMODULE mod)
124{
125#ifdef _WIN32
126 InitOnceExecuteOnce(&init_once_module, init_module, NULL, NULL);
127 if (pFreeLibraryWhenCallbackReturns)
128 {
129 pFreeLibraryWhenCallbackReturns(pci, mod);
130 return;
131 }
132#endif
133 /* No default implementation */
134 WLog_ERR("TODO", "TODO: implement");
135}
136
137VOID DisassociateCurrentThreadFromCallback(WINPR_ATTR_UNUSED PTP_CALLBACK_INSTANCE pci)
138{
139#ifdef _WIN32
140 InitOnceExecuteOnce(&init_once_module, init_module, NULL, NULL);
141 if (pDisassociateCurrentThreadFromCallback)
142 {
143 pDisassociateCurrentThreadFromCallback(pci);
144 return;
145 }
146#endif
147 WLog_ERR("TODO", "TODO: implement");
148 /* No default implementation */
149}
150
151#endif /* WINPR_THREAD_POOL defined */