+#endif
+
+ public:
+ condition_variable() {
+#ifdef _WIN32
+# if USE_WIN32_CONDITION_VARIABLES
+ InitializeConditionVariable(&_native_handle);
+# else
+ cWaiters = 0;
+ hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
+# endif
+#else
+ pthread_cond_init(&_native_handle, NULL);
+#endif
+ }
+
+ ~condition_variable() {
+#ifdef _WIN32
+# if USE_WIN32_CONDITION_VARIABLES
+ /* No-op */
+# else
+ CloseHandle(hEvent);
+# endif
+#else
+ pthread_cond_destroy(&_native_handle);
+#endif
+ }
+
+ inline void
+ signal(void) {
+#ifdef _WIN32
+# if USE_WIN32_CONDITION_VARIABLES
+ WakeConditionVariable(&_native_handle);
+# else
+ if (cWaiters) {
+ SetEvent(hEvent);
+ }
+# endif
+#else
+ pthread_cond_signal(&_native_handle);
+#endif
+ }
+
+ inline void
+ wait(unique_lock<mutex> & lock) {
+ mutex::native_handle_type & mutex_native_handle = lock.mutex()->native_handle();
+#ifdef _WIN32
+# if USE_WIN32_CONDITION_VARIABLES
+ SleepConditionVariableCS(&_native_handle, &mutex_native_handle, INFINITE);
+# else
+ InterlockedIncrement(&cWaiters);
+ LeaveCriticalSection(&mutex_native_handle);
+ WaitForSingleObject(hEvent, INFINITE);
+ EnterCriticalSection(&mutex_native_handle);
+ InterlockedDecrement(&cWaiters);
+# endif
+#else
+ pthread_cond_wait(&_native_handle, &mutex_native_handle);
+#endif
+ }