Implement SkCondVar for windows.

Only works on Vista or later, since it uses condition variables.

Review URL: https://codereview.appspot.com/6812062

git-svn-id: http://skia.googlecode.com/svn/trunk@6225 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/utils/SkCondVar.cpp b/src/utils/SkCondVar.cpp
index 8cbab58..5d001c0 100644
--- a/src/utils/SkCondVar.cpp
+++ b/src/utils/SkCondVar.cpp
@@ -8,31 +8,61 @@
 #include "SkCondVar.h"
 
 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);
+#endif
 }
 
 SkCondVar::~SkCondVar() {
+#ifdef SK_USE_POSIX_THREADS
     pthread_mutex_destroy(&fMutex);
     pthread_cond_destroy(&fCond);
+#elif defined(SK_BUILD_FOR_WIN32)
+    DeleteCriticalSection(&fCriticalSection);
+    // No need to clean up fCondition.
+#endif
 }
 
 void SkCondVar::lock() {
+#ifdef SK_USE_POSIX_THREADS
     pthread_mutex_lock(&fMutex);
+#elif defined(SK_BUILD_FOR_WIN32)
+    EnterCriticalSection(&fCriticalSection);
+#endif
 }
 
 void SkCondVar::unlock() {
+#ifdef SK_USE_POSIX_THREADS
     pthread_mutex_unlock(&fMutex);
+#elif defined(SK_BUILD_FOR_WIN32)
+    LeaveCriticalSection(&fCriticalSection);
+#endif
 }
 
 void SkCondVar::wait() {
+#ifdef SK_USE_POSIX_THREADS
     pthread_cond_wait(&fCond, &fMutex);
+#elif defined(SK_BUILD_FOR_WIN32)
+    SleepConditionVariableCS(&fCondition, &fCriticalSection, INFINITE);
+#endif
 }
 
 void SkCondVar::signal() {
+#ifdef SK_USE_POSIX_THREADS
     pthread_cond_signal(&fCond);
+#elif defined(SK_BUILD_FOR_WIN32)
+    WakeConditionVariable(&fCondition);
+#endif
 }
 
 void SkCondVar::broadcast() {
+#ifdef SK_USE_POSIX_THREADS
     pthread_cond_broadcast(&fCond);
+#elif defined(SK_BUILD_FOR_WIN32)
+    WakeAllConditionVariable(&fCondition);
+#endif
 }