/*
 * 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;
}
