/* * mthr_init.c * * Do the thread-support DLL initialization. * * This file is used iff the following conditions are met: * - gcc uses -mthreads option * - user code uses C++ exceptions * * The sole job of the Mingw thread support DLL (MingwThr) is to catch * all the dying threads and clean up the data allocated in the TLSs * for exception contexts during C++ EH. Posix threads have key dtors, * but win32 TLS keys do not, hence the magic. Without this, there's at * least `24 * sizeof (void*)' bytes leaks for each catch/throw in each * thread. * * See mthr.c for all the magic. * * Created by Mumit Khan * */ #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN #include BOOL APIENTRY DllMain (HANDLE hDllHandle, DWORD reason, LPVOID reserved /* Not used. */ ); /* *---------------------------------------------------------------------- * * DllMain -- * * This routine is called by the Mingw32, Cygwin32 or VC++ C run * time library init code, or the Borland DllEntryPoint routine. It * is responsible for initializing various dynamically loaded * libraries. * * Results: * TRUE on sucess, FALSE on failure. * * Side effects: * *---------------------------------------------------------------------- */ BOOL APIENTRY DllMain (HANDLE hDllHandle /* Library instance handle. */, DWORD reason /* Reason this function is being called. */, LPVOID reserved /* Not used. */) { extern CRITICAL_SECTION __mingwthr_cs; extern void __mingwthr_run_key_dtors( void ); #ifdef DEBUG printf ("%s: reason %d\n", __FUNCTION__, reason ); #endif switch (reason) { case DLL_PROCESS_ATTACH: InitializeCriticalSection (&__mingwthr_cs); break; case DLL_PROCESS_DETACH: __mingwthr_run_key_dtors(); DeleteCriticalSection (&__mingwthr_cs); break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: __mingwthr_run_key_dtors(); break; } return TRUE; }