Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / third_party / skia / src / utils / SkCondVar.cpp
index 5d001c0..ce5ef3e 100644 (file)
@@ -7,13 +7,47 @@
 
 #include "SkCondVar.h"
 
+#if defined(SK_BUILD_FOR_WIN32)
+    static void (WINAPI *initialize_condition_variable)(PCONDITION_VARIABLE);
+    static BOOL (WINAPI *sleep_condition_variable)(PCONDITION_VARIABLE, PCRITICAL_SECTION, DWORD);
+    static void (WINAPI *wake_condition_variable)(PCONDITION_VARIABLE);
+    static void (WINAPI *wake_all_condition_variable)(PCONDITION_VARIABLE);
+
+    template <typename T>
+    static void set_fn_ptr(T* ptr, FARPROC fn) { *ptr = reinterpret_cast<T>(fn); }
+#endif
+
+bool SkCondVar::Supported() {
+#ifdef SK_USE_POSIX_THREADS
+    return true;
+#elif defined(SK_BUILD_FOR_WIN32)
+    // If we're >= Vista we'll find these functions.  Otherwise (XP) SkCondVar is not supported.
+    HMODULE kernel32 = GetModuleHandleA("kernel32.dll");
+    set_fn_ptr(&initialize_condition_variable,
+               GetProcAddress(kernel32, "InitializeConditionVariable"));
+    set_fn_ptr(&sleep_condition_variable,
+               GetProcAddress(kernel32, "SleepConditionVariableCS"));
+    set_fn_ptr(&wake_condition_variable,
+               GetProcAddress(kernel32, "WakeConditionVariable"));
+    set_fn_ptr(&wake_all_condition_variable,
+               GetProcAddress(kernel32, "WakeAllConditionVariable"));
+    return initialize_condition_variable
+        && sleep_condition_variable
+        && wake_condition_variable
+        && wake_all_condition_variable;
+#else
+    return false;
+#endif
+}
+
 SkCondVar::SkCondVar() {
 #ifdef SK_USE_POSIX_THREADS
     pthread_mutex_init(&fMutex, NULL /* default mutex attr */);
     pthread_cond_init(&fCond, NULL /* default cond attr */);
 #elif defined(SK_BUILD_FOR_WIN32)
     InitializeCriticalSection(&fCriticalSection);
-    InitializeConditionVariable(&fCondition);
+    SkASSERT(initialize_condition_variable);
+    initialize_condition_variable(&fCondition);
 #endif
 }
 
@@ -47,7 +81,8 @@ void SkCondVar::wait() {
 #ifdef SK_USE_POSIX_THREADS
     pthread_cond_wait(&fCond, &fMutex);
 #elif defined(SK_BUILD_FOR_WIN32)
-    SleepConditionVariableCS(&fCondition, &fCriticalSection, INFINITE);
+    SkASSERT(sleep_condition_variable);
+    sleep_condition_variable(&fCondition, &fCriticalSection, INFINITE);
 #endif
 }
 
@@ -55,7 +90,8 @@ void SkCondVar::signal() {
 #ifdef SK_USE_POSIX_THREADS
     pthread_cond_signal(&fCond);
 #elif defined(SK_BUILD_FOR_WIN32)
-    WakeConditionVariable(&fCondition);
+    SkASSERT(wake_condition_variable);
+    wake_condition_variable(&fCondition);
 #endif
 }
 
@@ -63,6 +99,7 @@ void SkCondVar::broadcast() {
 #ifdef SK_USE_POSIX_THREADS
     pthread_cond_broadcast(&fCond);
 #elif defined(SK_BUILD_FOR_WIN32)
-    WakeAllConditionVariable(&fCondition);
+    SkASSERT(wake_all_condition_variable);
+    wake_all_condition_variable(&fCondition);
 #endif
 }