diff options
Diffstat (limited to 'utils/SkCondVar.cpp')
-rw-r--r-- | utils/SkCondVar.cpp | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/utils/SkCondVar.cpp b/utils/SkCondVar.cpp new file mode 100644 index 00000000..5d001c0e --- /dev/null +++ b/utils/SkCondVar.cpp @@ -0,0 +1,68 @@ +/* + * 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 +} |