[a33932]: / dll.c  Maximize  Restore  History

Download this file

124 lines (100 with data), 2.4 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
* dll.c
*
* Description:
* This translation unit implements DLL initialisation.
*/
#include <malloc.h>
#include "pthread.h"
#include "implement.h"
/*
* Function pointer to TryEnterCriticalSection if it exists; otherwise NULL
*/
BOOL (WINAPI *_pthread_try_enter_critical_section)(LPCRITICAL_SECTION) = NULL;
/*
* Handle to kernel32.dll
*/
static HINSTANCE _pthread_h_kernel32;
#ifdef _MSC_VER
/*
* lpvReserved yields an unreferenced formal parameter;
* ignore it
*/
#pragma warning( disable : 4100 )
#endif
#ifdef __cplusplus
/*
* Dear c++: Please don't mangle this name. -thanks
*/
extern "C"
{
#endif /* __cplusplus */
BOOL WINAPI DllMain( HINSTANCE, DWORD, LPVOID);
#ifdef __cplusplus
}
#endif /* __cplusplus */
BOOL WINAPI
DllMain (
HINSTANCE hinstDll,
DWORD fdwReason,
LPVOID lpvReserved
)
{
BOOL result = TRUE;
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
/*
* The DLL is being mapped into the process's address space
*/
result = _pthread_processInitialize ();
/* Load KERNEL32 and try to get address of TryEnterCriticalSection */
_pthread_h_kernel32 = LoadLibrary(TEXT("KERNEL32.DLL"));
_pthread_try_enter_critical_section =
(BOOL (PT_STDCALL *)(LPCRITICAL_SECTION))
GetProcAddress(_pthread_h_kernel32,
(LPCSTR) "TryEnterCriticalSection");
break;
case DLL_THREAD_ATTACH:
/*
* A thread is being created
*/
result = TRUE;
break;
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
/*
* A thread is exiting cleanly
* NOTE: The "main" thread detaches using
* DLL_PROCESS_DETACH
*/
{
pthread_t self;
if (_pthread_processInitialized)
{
self = (pthread_t) pthread_getspecific (_pthread_selfThreadKey);
/*
* Detached threads have their resources automatically
* cleaned up upon exit (others must be 'joined'
*/
if (self != NULL &&
self->detachState == PTHREAD_CREATE_DETACHED)
{
pthread_setspecific (_pthread_selfThreadKey, NULL);
_pthread_threadDestroy (self);
}
if (fdwReason == DLL_PROCESS_DETACH)
{
/*
* The DLL is being unmapped into the process's address space
*/
_pthread_processTerminate ();
(void) FreeLibrary(_pthread_h_kernel32);
}
}
result = TRUE;
}
break;
}
return (result);
} /* DllMain */