1363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger/* 2363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Copyright 2012 Google Inc. 3363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * 4363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Use of this source code is governed by a BSD-style license that can be 5363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * found in the LICENSE file. 6363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger */ 7363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 8363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkCondVar.h" 9363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 10363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerSkCondVar::SkCondVar() { 11363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#ifdef SK_USE_POSIX_THREADS 12363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger pthread_mutex_init(&fMutex, NULL /* default mutex attr */); 13363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger pthread_cond_init(&fCond, NULL /* default cond attr */); 14363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#elif defined(SK_BUILD_FOR_WIN32) 15363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger InitializeCriticalSection(&fCriticalSection); 16363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger InitializeConditionVariable(&fCondition); 17363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#endif 18363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger} 19363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 20363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerSkCondVar::~SkCondVar() { 21363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#ifdef SK_USE_POSIX_THREADS 22363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger pthread_mutex_destroy(&fMutex); 23363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger pthread_cond_destroy(&fCond); 24363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#elif defined(SK_BUILD_FOR_WIN32) 25363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger DeleteCriticalSection(&fCriticalSection); 26363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // No need to clean up fCondition. 27363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#endif 28363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger} 29363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 30363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergervoid SkCondVar::lock() { 31363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#ifdef SK_USE_POSIX_THREADS 32363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger pthread_mutex_lock(&fMutex); 33363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#elif defined(SK_BUILD_FOR_WIN32) 34363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger EnterCriticalSection(&fCriticalSection); 35363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#endif 36363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger} 37363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 38363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergervoid SkCondVar::unlock() { 39363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#ifdef SK_USE_POSIX_THREADS 40363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger pthread_mutex_unlock(&fMutex); 41363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#elif defined(SK_BUILD_FOR_WIN32) 42363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger LeaveCriticalSection(&fCriticalSection); 43363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#endif 44363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger} 45363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 46363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergervoid SkCondVar::wait() { 47363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#ifdef SK_USE_POSIX_THREADS 48363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger pthread_cond_wait(&fCond, &fMutex); 49363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#elif defined(SK_BUILD_FOR_WIN32) 50363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SleepConditionVariableCS(&fCondition, &fCriticalSection, INFINITE); 51363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#endif 52363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger} 53363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 54363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergervoid SkCondVar::signal() { 55363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#ifdef SK_USE_POSIX_THREADS 56363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger pthread_cond_signal(&fCond); 57363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#elif defined(SK_BUILD_FOR_WIN32) 58363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger WakeConditionVariable(&fCondition); 59363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#endif 60363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger} 61363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 62363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergervoid SkCondVar::broadcast() { 63363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#ifdef SK_USE_POSIX_THREADS 64363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger pthread_cond_broadcast(&fCond); 65363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#elif defined(SK_BUILD_FOR_WIN32) 66363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger WakeAllConditionVariable(&fCondition); 67363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#endif 68363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger} 69