platform/win32: moved the static variables in os-threads from the header to a separat...
[deb_libcec.git] / src / lib / platform / windows / os-threads.h
index e082691e24582b1afb6208488d8aa8118ecf8680..3714c16711950919edd768708e5d2cee4fa48594 100644 (file)
@@ -47,109 +47,16 @@ namespace PLATFORM
   // windows vista+ conditions
   typedef VOID (WINAPI *ConditionArg)     (CONDITION_VARIABLE*);
   typedef BOOL (WINAPI *ConditionMutexArg)(CONDITION_VARIABLE*, CRITICAL_SECTION*, DWORD);
-  static ConditionArg                     g_InitializeConditionVariable;
-  static ConditionArg                     g_WakeConditionVariable;
-  static ConditionArg                     g_WakeAllConditionVariable;
-  static ConditionMutexArg                g_SleepConditionVariableCS;
-
-  // check whether vista+ conditions are available at runtime  
-  static bool CheckVistaConditionFunctions(void)
-  {
-    static int iHasVistaConditionFunctions(-1);
-    if (iHasVistaConditionFunctions == -1)
-    {
-      HMODULE handle = GetModuleHandle("Kernel32");
-      if (handle == NULL)
-      {
-        iHasVistaConditionFunctions = 0;
-      }
-      else
-      {
-        g_InitializeConditionVariable = (ConditionArg)     GetProcAddress(handle,"InitializeConditionVariable");
-        g_WakeConditionVariable       = (ConditionArg)     GetProcAddress(handle,"WakeConditionVariable");
-        g_WakeAllConditionVariable    = (ConditionArg)     GetProcAddress(handle,"WakeAllConditionVariable");
-        g_SleepConditionVariableCS    = (ConditionMutexArg)GetProcAddress(handle,"SleepConditionVariableCS");
-
-        // 1 when everything is resolved, 0 otherwise
-        iHasVistaConditionFunctions = g_InitializeConditionVariable &&
-                                      g_WakeConditionVariable &&
-                                      g_WakeAllConditionVariable &&
-                                      g_SleepConditionVariableCS ? 1 : 0;
-      }
-    }
-    return iHasVistaConditionFunctions == 1;
-  }
 
   class CConditionImpl
   {
   public:
-    CConditionImpl(void)
-    {
-      m_bOnVista = CheckVistaConditionFunctions();
-      if (m_bOnVista)
-        (*g_InitializeConditionVariable)(m_conditionVista = new CONDITION_VARIABLE);
-      else
-        m_conditionPreVista = ::CreateEvent(NULL, TRUE, FALSE, NULL);
-    }
-
-    virtual ~CConditionImpl(void)
-    {
-      if (m_bOnVista)
-        delete m_conditionVista;
-      else
-        ::CloseHandle(m_conditionPreVista);
-    }
-
-    void Signal(void)
-    {
-      if (m_bOnVista)
-        (*g_WakeConditionVariable)(m_conditionVista);
-      else
-        ::SetEvent(m_conditionPreVista);
-    }
-
-    void Broadcast(void)
-    {
-      if (m_bOnVista)
-        (*g_WakeAllConditionVariable)(m_conditionVista);
-      else
-        ::SetEvent(m_conditionPreVista);
-    }
-
-    bool Wait(mutex_t &mutex)
-    {
-      if (m_bOnVista)
-      {
-        return ((*g_SleepConditionVariableCS)(m_conditionVista, mutex, INFINITE) ? true : false);
-      }
-      else
-      {
-        ::ResetEvent(m_conditionPreVista);
-        MutexUnlock(mutex);
-        DWORD iWaitReturn = ::WaitForSingleObject(m_conditionPreVista, 1000);
-        MutexLock(mutex);
-        return (iWaitReturn == 0);
-      }
-    }
-
-    bool Wait(mutex_t &mutex, uint32_t iTimeoutMs)
-    {
-      if (iTimeoutMs == 0)
-        return Wait(mutex);
-
-      if (m_bOnVista)
-      {
-        return ((*g_SleepConditionVariableCS)(m_conditionVista, mutex, iTimeoutMs) ? true : false);
-      }
-      else
-      {
-        ::ResetEvent(m_conditionPreVista);
-        MutexUnlock(mutex);
-        DWORD iWaitReturn = ::WaitForSingleObject(m_conditionPreVista, iTimeoutMs);
-        MutexLock(mutex);
-        return (iWaitReturn == 0);
-      }
-    }
+    CConditionImpl(void);
+    virtual ~CConditionImpl(void);
+    void Signal(void);
+    void Broadcast(void);
+    bool Wait(mutex_t &mutex);
+    bool Wait(mutex_t &mutex, uint32_t iTimeoutMs);
 
     bool                m_bOnVista;
     CONDITION_VARIABLE *m_conditionVista;