[5ab9f5]: dll.c  Maximize  Restore  History

Download this file

104 lines (84 with data), 2.2 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
/*
* 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 _WIN32
/*
* lpvReserved yields an unreferenced formal parameter;
* ignore it
*/
#pragma warning( disable : 4100 )
#endif
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 =
(void *) GetProcAddress(_pthread_h_kernel32,
"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 */

Get latest updates about Open Source Projects, Conferences and News.

Sign up for the SourceForge newsletter:

JavaScript is required for this form.





No, thanks