Blame winpr/libwinpr/pool/callback_cleanup.c

Packit 1fb8d4
/**
Packit 1fb8d4
 * WinPR: Windows Portable Runtime
Packit 1fb8d4
 * Thread Pool API (Callback Clean-up)
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
#ifdef HAVE_CONFIG_H
Packit 1fb8d4
#include "config.h"
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#include <winpr/crt.h>
Packit 1fb8d4
#include <winpr/pool.h>
Packit 1fb8d4
#include <winpr/library.h>
Packit 1fb8d4
Packit 1fb8d4
#include "pool.h"
Packit 1fb8d4
Packit 1fb8d4
#ifdef WINPR_THREAD_POOL
Packit 1fb8d4
Packit 1fb8d4
#ifdef _WIN32
Packit 1fb8d4
static INIT_ONCE init_once_module = INIT_ONCE_STATIC_INIT;
Packit Service 5a9772
static VOID(WINAPI* pSetEventWhenCallbackReturns)(PTP_CALLBACK_INSTANCE pci, HANDLE evt);
Packit Service 5a9772
static VOID(WINAPI* pReleaseSemaphoreWhenCallbackReturns)(PTP_CALLBACK_INSTANCE pci, HANDLE sem,
Packit Service 5a9772
                                                          DWORD crel);
Packit Service 5a9772
static VOID(WINAPI* pReleaseMutexWhenCallbackReturns)(PTP_CALLBACK_INSTANCE pci, HANDLE mut);
Packit Service 5a9772
static VOID(WINAPI* pLeaveCriticalSectionWhenCallbackReturns)(PTP_CALLBACK_INSTANCE pci,
Packit Service 5a9772
                                                              PCRITICAL_SECTION pcs);
Packit Service 5a9772
static VOID(WINAPI* pFreeLibraryWhenCallbackReturns)(PTP_CALLBACK_INSTANCE pci, HMODULE mod);
Packit Service 5a9772
static VOID(WINAPI* pDisassociateCurrentThreadFromCallback)(PTP_CALLBACK_INSTANCE pci);
Packit 1fb8d4
Packit Service 5a9772
static BOOL CALLBACK init_module(PINIT_ONCE once, PVOID param, PVOID* context)
Packit 1fb8d4
{
Packit 1fb8d4
	HMODULE kernel32 = LoadLibraryA("kernel32.dll");
Packit 1fb8d4
	if (kernel32)
Packit 1fb8d4
	{
Packit Service 5a9772
		pSetEventWhenCallbackReturns =
Packit Service 5a9772
		    (void*)GetProcAddress(kernel32, "SetEventWhenCallbackReturns");
Packit Service 5a9772
		pReleaseSemaphoreWhenCallbackReturns =
Packit Service 5a9772
		    (void*)GetProcAddress(kernel32, "ReleaseSemaphoreWhenCallbackReturns");
Packit Service 5a9772
		pReleaseMutexWhenCallbackReturns =
Packit Service 5a9772
		    (void*)GetProcAddress(kernel32, "ReleaseMutexWhenCallbackReturns");
Packit Service 5a9772
		pLeaveCriticalSectionWhenCallbackReturns =
Packit Service 5a9772
		    (void*)GetProcAddress(kernel32, "LeaveCriticalSectionWhenCallbackReturns");
Packit Service 5a9772
		pFreeLibraryWhenCallbackReturns =
Packit Service 5a9772
		    (void*)GetProcAddress(kernel32, "FreeLibraryWhenCallbackReturns");
Packit Service 5a9772
		pDisassociateCurrentThreadFromCallback =
Packit Service 5a9772
		    (void*)GetProcAddress(kernel32, "DisassociateCurrentThreadFromCallback");
Packit 1fb8d4
	}
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
VOID SetEventWhenCallbackReturns(PTP_CALLBACK_INSTANCE pci, HANDLE evt)
Packit 1fb8d4
{
Packit 1fb8d4
#ifdef _WIN32
Packit 1fb8d4
	InitOnceExecuteOnce(&init_once_module, init_module, NULL, NULL);
Packit 1fb8d4
	if (pSetEventWhenCallbackReturns)
Packit 1fb8d4
	{
Packit 1fb8d4
		pSetEventWhenCallbackReturns(pci, evt);
Packit 1fb8d4
		return;
Packit 1fb8d4
	}
Packit 1fb8d4
#endif
Packit 1fb8d4
	/* No default implementation */
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
VOID ReleaseSemaphoreWhenCallbackReturns(PTP_CALLBACK_INSTANCE pci, HANDLE sem, DWORD crel)
Packit 1fb8d4
{
Packit 1fb8d4
#ifdef _WIN32
Packit 1fb8d4
	InitOnceExecuteOnce(&init_once_module, init_module, NULL, NULL);
Packit 1fb8d4
	if (pReleaseSemaphoreWhenCallbackReturns)
Packit 1fb8d4
	{
Packit 1fb8d4
		pReleaseSemaphoreWhenCallbackReturns(pci, sem, crel);
Packit 1fb8d4
		return;
Packit 1fb8d4
	}
Packit 1fb8d4
#endif
Packit 1fb8d4
	/* No default implementation */
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
VOID ReleaseMutexWhenCallbackReturns(PTP_CALLBACK_INSTANCE pci, HANDLE mut)
Packit 1fb8d4
{
Packit 1fb8d4
#ifdef _WIN32
Packit 1fb8d4
	InitOnceExecuteOnce(&init_once_module, init_module, NULL, NULL);
Packit 1fb8d4
	if (pReleaseMutexWhenCallbackReturns)
Packit 1fb8d4
	{
Packit 1fb8d4
		pReleaseMutexWhenCallbackReturns(pci, mut);
Packit 1fb8d4
		return;
Packit 1fb8d4
	}
Packit 1fb8d4
#endif
Packit 1fb8d4
	/* No default implementation */
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
VOID LeaveCriticalSectionWhenCallbackReturns(PTP_CALLBACK_INSTANCE pci, PCRITICAL_SECTION pcs)
Packit 1fb8d4
{
Packit 1fb8d4
#ifdef _WIN32
Packit 1fb8d4
	InitOnceExecuteOnce(&init_once_module, init_module, NULL, NULL);
Packit 1fb8d4
	if (pLeaveCriticalSectionWhenCallbackReturns)
Packit 1fb8d4
	{
Packit 1fb8d4
		pLeaveCriticalSectionWhenCallbackReturns(pci, pcs);
Packit 1fb8d4
	}
Packit 1fb8d4
#endif
Packit 1fb8d4
	/* No default implementation */
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
VOID FreeLibraryWhenCallbackReturns(PTP_CALLBACK_INSTANCE pci, HMODULE mod)
Packit 1fb8d4
{
Packit 1fb8d4
#ifdef _WIN32
Packit 1fb8d4
	InitOnceExecuteOnce(&init_once_module, init_module, NULL, NULL);
Packit 1fb8d4
	if (pFreeLibraryWhenCallbackReturns)
Packit 1fb8d4
	{
Packit 1fb8d4
		pFreeLibraryWhenCallbackReturns(pci, mod);
Packit 1fb8d4
		return;
Packit 1fb8d4
	}
Packit 1fb8d4
#endif
Packit 1fb8d4
	/* No default implementation */
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
VOID DisassociateCurrentThreadFromCallback(PTP_CALLBACK_INSTANCE pci)
Packit 1fb8d4
{
Packit 1fb8d4
#ifdef _WIN32
Packit 1fb8d4
	InitOnceExecuteOnce(&init_once_module, init_module, NULL, NULL);
Packit 1fb8d4
	if (pDisassociateCurrentThreadFromCallback)
Packit 1fb8d4
	{
Packit 1fb8d4
		pDisassociateCurrentThreadFromCallback(pci);
Packit 1fb8d4
		return;
Packit 1fb8d4
	}
Packit 1fb8d4
#endif
Packit 1fb8d4
	/* No default implementation */
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
#endif /* WINPR_THREAD_POOL defined */