81 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * 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  <khan@nanotech.wisc.edu>
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
#define WIN32_LEAN_AND_MEAN
 | 
						|
#include <windows.h>
 | 
						|
#undef WIN32_LEAN_AND_MEAN
 | 
						|
#include <stdio.h>
 | 
						|
 | 
						|
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;
 | 
						|
}
 |