25 #include "dbus-internals.h" 
   26 #include "dbus-sysdeps.h" 
   27 #include "dbus-sysdeps-win.h" 
   28 #include "dbus-threads.h" 
   29 #include "dbus-list.h" 
   36 static CRITICAL_SECTION init_lock;
 
   40 _dbus_threads_windows_init_global (
void)
 
   44   _dbus_threads_windows_ensure_ctor_linked ();
 
   46   InitializeCriticalSection (&init_lock);
 
   47   global_init_done = 
TRUE;
 
   55 static DWORD dbus_cond_event_tls = TLS_OUT_OF_INDEXES;
 
   58 static HMODULE dbus_dll_hmodule;
 
   61 _dbus_win_get_dll_hmodule (
void)
 
   63   return dbus_dll_hmodule;
 
   67 #define hinst_t HANDLE 
   69 #define hinst_t HINSTANCE 
   72 BOOL WINAPI DllMain (hinst_t, DWORD, LPVOID);
 
   76 DllMain (hinst_t hinstDLL,
 
   83     case DLL_PROCESS_ATTACH:
 
   84       dbus_dll_hmodule = hinstDLL;
 
   86     case DLL_THREAD_DETACH:
 
   87       if (dbus_cond_event_tls != TLS_OUT_OF_INDEXES)
 
   89           event = TlsGetValue(dbus_cond_event_tls);
 
   91           TlsSetValue(dbus_cond_event_tls, 
NULL);
 
   94     case DLL_PROCESS_DETACH: 
 
   95       if (dbus_cond_event_tls != TLS_OUT_OF_INDEXES)
 
   97           event = TlsGetValue(dbus_cond_event_tls);
 
   99           TlsSetValue(dbus_cond_event_tls, 
NULL);
 
  101           TlsFree(dbus_cond_event_tls); 
 
  111 _dbus_platform_cmutex_new (
void)
 
  119 _dbus_platform_rmutex_new (
void)
 
  127 _dbus_platform_cmutex_free (
DBusCMutex *mutex)
 
  129   CloseHandle ((HANDLE *) mutex);
 
  133 _dbus_platform_rmutex_free (
DBusRMutex *mutex)
 
  135   CloseHandle ((HANDLE *) mutex);
 
  139 _dbus_platform_cmutex_lock (
DBusCMutex *mutex)
 
  141   WaitForSingleObject ((HANDLE *) mutex, INFINITE);
 
  145 _dbus_platform_rmutex_lock (
DBusRMutex *mutex)
 
  147   WaitForSingleObject ((HANDLE *) mutex, INFINITE);
 
  151 _dbus_platform_cmutex_unlock (
DBusCMutex *mutex)
 
  153   ReleaseMutex ((HANDLE *) mutex);
 
  157 _dbus_platform_rmutex_unlock (
DBusRMutex *mutex)
 
  159   ReleaseMutex ((HANDLE *) mutex);
 
  163 _dbus_platform_condvar_new (
void)
 
  173   InitializeCriticalSection (&cond->
lock);
 
  180   DeleteCriticalSection (&cond->
lock);
 
  192   HANDLE 
event = TlsGetValue (dbus_cond_event_tls);
 
  199       TlsSetValue (dbus_cond_event_tls, event);
 
  202   EnterCriticalSection (&cond->
lock);
 
  205   _dbus_assert (WaitForSingleObject (event, 0) == WAIT_TIMEOUT);
 
  209   LeaveCriticalSection (&cond->
lock);
 
  214   _dbus_platform_cmutex_unlock (mutex);
 
  215   retval = WaitForSingleObject (event, milliseconds);
 
  216   _dbus_platform_cmutex_lock (mutex);
 
  218   if (retval == WAIT_TIMEOUT)
 
  220       EnterCriticalSection (&cond->
lock);
 
  227       retval = WaitForSingleObject (event, 0);
 
  229       LeaveCriticalSection (&cond->
lock);
 
  232 #ifndef DBUS_DISABLE_ASSERT 
  233   EnterCriticalSection (&cond->
lock);
 
  238   LeaveCriticalSection (&cond->
lock);
 
  241   return retval != WAIT_TIMEOUT;
 
  248   _dbus_condvar_wait_win32 (cond, mutex, INFINITE);
 
  252 _dbus_platform_condvar_wait_timeout (
DBusCondVar               *cond,
 
  254                                      int                        timeout_milliseconds)
 
  256   return _dbus_condvar_wait_win32 (cond, mutex, timeout_milliseconds);
 
  260 _dbus_platform_condvar_wake_one (
DBusCondVar *cond)
 
  262   EnterCriticalSection (&cond->
lock);
 
  273   LeaveCriticalSection (&cond->
lock);
 
  282   if (dbus_cond_event_tls == TLS_OUT_OF_INDEXES)
 
  284       dbus_cond_event_tls = TlsAlloc ();
 
  285       if (dbus_cond_event_tls == TLS_OUT_OF_INDEXES)
 
  296   EnterCriticalSection (&init_lock);
 
  303   LeaveCriticalSection (&init_lock);
 
  306 #ifdef DBUS_ENABLE_VERBOSE_MODE 
  308 _dbus_print_thread (
void)