libwinpr-pool: fix InitializeThreadpoolEnvironment

This commit is contained in:
Marc-André Moreau 2013-01-22 17:24:57 -05:00
parent 74bba0e767
commit fb189989af
3 changed files with 67 additions and 50 deletions

View File

@ -55,7 +55,32 @@ typedef struct _TP_CLEANUP_GROUP TP_CLEANUP_GROUP, *PTP_CLEANUP_GROUP;
typedef VOID (*PTP_CLEANUP_GROUP_CANCEL_CALLBACK)(PVOID ObjectContext, PVOID CleanupContext); typedef VOID (*PTP_CLEANUP_GROUP_CANCEL_CALLBACK)(PVOID ObjectContext, PVOID CleanupContext);
#if 0 typedef struct _TP_CALLBACK_ENVIRON_V1
{
TP_VERSION Version;
PTP_POOL Pool;
PTP_CLEANUP_GROUP CleanupGroup;
PTP_CLEANUP_GROUP_CANCEL_CALLBACK CleanupGroupCancelCallback;
PVOID RaceDll;
struct _ACTIVATION_CONTEXT* ActivationContext;
PTP_SIMPLE_CALLBACK FinalizationCallback;
union
{
DWORD Flags;
struct
{
DWORD LongFunction:1;
DWORD Persistent:1;
DWORD Private:30;
} s;
} u;
} TP_CALLBACK_ENVIRON_V1;
#endif
/* Non-Windows and pre Windows 7 */
#if ((!defined(_WIN32)) || (defined(_WIN32) && (_WIN32_WINNT < 0x0601)))
typedef struct _TP_CALLBACK_ENVIRON_V3 typedef struct _TP_CALLBACK_ENVIRON_V3
{ {
@ -83,33 +108,7 @@ typedef struct _TP_CALLBACK_ENVIRON_V3
DWORD Size; DWORD Size;
} TP_CALLBACK_ENVIRON_V3; } TP_CALLBACK_ENVIRON_V3;
typedef TP_CALLBACK_ENVIRON_V3 TP_CALLBACK_ENVIRON, *PTP_CALLBACK_ENVIRON; //typedef TP_CALLBACK_ENVIRON_V3 TP_CALLBACK_ENVIRON, *PTP_CALLBACK_ENVIRON;
#else
typedef struct _TP_CALLBACK_ENVIRON_V1
{
TP_VERSION Version;
PTP_POOL Pool;
PTP_CLEANUP_GROUP CleanupGroup;
PTP_CLEANUP_GROUP_CANCEL_CALLBACK CleanupGroupCancelCallback;
PVOID RaceDll;
struct _ACTIVATION_CONTEXT* ActivationContext;
PTP_SIMPLE_CALLBACK FinalizationCallback;
union
{
DWORD Flags;
struct
{
DWORD LongFunction:1;
DWORD Persistent:1;
DWORD Private:30;
} s;
} u;
} TP_CALLBACK_ENVIRON_V1;
#endif
#endif #endif

View File

@ -26,13 +26,41 @@
#include "pool.h" #include "pool.h"
VOID InitializeCallbackEnvironment_V1(TP_CALLBACK_ENVIRON_V1* pcbe)
{
pcbe->Version = 1;
pcbe->Pool = NULL;
pcbe->CleanupGroup = NULL;
pcbe->CleanupGroupCancelCallback = NULL;
pcbe->RaceDll = NULL;
pcbe->ActivationContext = NULL;
pcbe->FinalizationCallback = NULL;
pcbe->u.Flags = 0;
}
VOID InitializeCallbackEnvironment_V3(TP_CALLBACK_ENVIRON_V3* pcbe)
{
pcbe->Version = 3;
pcbe->Pool = NULL;
pcbe->CleanupGroup = NULL;
pcbe->CleanupGroupCancelCallback = NULL;
pcbe->RaceDll = NULL;
pcbe->ActivationContext = NULL;
pcbe->FinalizationCallback = NULL;
pcbe->u.Flags = 0;
pcbe->CallbackPriority = TP_CALLBACK_PRIORITY_NORMAL;
pcbe->Size = sizeof(TP_CALLBACK_ENVIRON);
}
#ifdef _WIN32 #ifdef _WIN32
static BOOL module_initialized = FALSE; static BOOL module_initialized = FALSE;
static BOOL module_available = FALSE; static BOOL module_available = FALSE;
static HMODULE kernel32_module = NULL; static HMODULE kernel32_module = NULL;
static VOID (WINAPI * pInitializeThreadpoolEnvironment)(PTP_CALLBACK_ENVIRON pcbe);
static VOID (WINAPI * pDestroyThreadpoolEnvironment)(PTP_CALLBACK_ENVIRON pcbe); static VOID (WINAPI * pDestroyThreadpoolEnvironment)(PTP_CALLBACK_ENVIRON pcbe);
static VOID (WINAPI * pSetThreadpoolCallbackPool)(PTP_CALLBACK_ENVIRON pcbe, PTP_POOL ptpp); static VOID (WINAPI * pSetThreadpoolCallbackPool)(PTP_CALLBACK_ENVIRON pcbe, PTP_POOL ptpp);
static VOID (WINAPI * pSetThreadpoolCallbackCleanupGroup)(PTP_CALLBACK_ENVIRON pcbe, PTP_CLEANUP_GROUP ptpcg, PTP_CLEANUP_GROUP_CANCEL_CALLBACK pfng); static VOID (WINAPI * pSetThreadpoolCallbackCleanupGroup)(PTP_CALLBACK_ENVIRON pcbe, PTP_CLEANUP_GROUP ptpcg, PTP_CLEANUP_GROUP_CANCEL_CALLBACK pfng);
@ -53,7 +81,7 @@ static void module_init()
module_available = TRUE; module_available = TRUE;
pInitializeThreadpoolEnvironment = (void*) GetProcAddress(kernel32_module, "InitializeThreadpoolEnvironment"); /* InitializeThreadpoolEnvironment is an inline function */
pDestroyThreadpoolEnvironment = (void*) GetProcAddress(kernel32_module, "DestroyThreadpoolEnvironment"); pDestroyThreadpoolEnvironment = (void*) GetProcAddress(kernel32_module, "DestroyThreadpoolEnvironment");
pSetThreadpoolCallbackPool = (void*) GetProcAddress(kernel32_module, "SetThreadpoolCallbackPool"); pSetThreadpoolCallbackPool = (void*) GetProcAddress(kernel32_module, "SetThreadpoolCallbackPool");
pSetThreadpoolCallbackCleanupGroup = (void*) GetProcAddress(kernel32_module, "SetThreadpoolCallbackCleanupGroup"); pSetThreadpoolCallbackCleanupGroup = (void*) GetProcAddress(kernel32_module, "SetThreadpoolCallbackCleanupGroup");
@ -90,23 +118,10 @@ PTP_CALLBACK_ENVIRON GetDefaultThreadpoolEnvironment()
VOID InitializeThreadpoolEnvironment(PTP_CALLBACK_ENVIRON pcbe) VOID InitializeThreadpoolEnvironment(PTP_CALLBACK_ENVIRON pcbe)
{ {
#ifdef _WIN32 if (pcbe->Version == 3)
module_init(); InitializeCallbackEnvironment_V3((TP_CALLBACK_ENVIRON_V3*) pcbe);
else
if (pInitializeThreadpoolEnvironment) InitializeCallbackEnvironment_V1(pcbe);
pInitializeThreadpoolEnvironment(pcbe);
#else
pcbe->Version = 1;
pcbe->Pool = NULL;
pcbe->CleanupGroup = NULL;
pcbe->CleanupGroupCancelCallback = NULL;
pcbe->RaceDll = NULL;
pcbe->ActivationContext = NULL;
pcbe->FinalizationCallback = NULL;
pcbe->u.s.LongFunction = FALSE;
pcbe->u.s.Persistent = FALSE;
pcbe->u.s.Private = 0;
#endif
} }
VOID DestroyThreadpoolEnvironment(PTP_CALLBACK_ENVIRON pcbe) VOID DestroyThreadpoolEnvironment(PTP_CALLBACK_ENVIRON pcbe)

View File

@ -1,17 +1,19 @@
#include <winpr/crt.h> #include <winpr/crt.h>
#include <winpr/pool.h> #include <winpr/pool.h>
#include <winpr/interlocked.h>
static int count = 0; static LONG count = 0;
void test_WorkCallback(PTP_CALLBACK_INSTANCE instance, void* context, PTP_WORK work) void CALLBACK test_WorkCallback(PTP_CALLBACK_INSTANCE instance, void* context, PTP_WORK work)
{ {
int index; int index;
BYTE a[1024]; BYTE a[1024];
BYTE b[1024]; BYTE b[1024];
BYTE c[1024]; BYTE c[1024];
printf("Hello %s: %d (thread: %d)\n", context, count++, GetCurrentThreadId()); printf("Hello %s: %d (thread: %d)\n", context,
InterlockedIncrement(&count), GetCurrentThreadId());
for (index = 0; index < 100; index++) for (index = 0; index < 100; index++)
{ {
@ -93,6 +95,7 @@ int TestPoolWork(int argc, char* argv[])
DestroyThreadpoolEnvironment(&environment); DestroyThreadpoolEnvironment(&environment);
CloseThreadpoolWork(work);
CloseThreadpool(pool); CloseThreadpool(pool);
return 0; return 0;