| /* |
| * Copyright 2012 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #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 |
| } |