/* * Copyright 2012 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkCondVar_DEFINED #define SkCondVar_DEFINED #ifdef SK_USE_POSIX_THREADS #include <pthread.h> #elif defined(SK_BUILD_FOR_WIN32) #include <windows.h> #endif /** * Condition variable for blocking access to shared data from other threads and * controlling which threads are awake. * * Currently only supported on platforms with posix threads and Windows Vista and * above. */ class SkCondVar { public: SkCondVar(); ~SkCondVar(); /** * Lock a mutex. Must be done before calling the other functions on this object. */ void lock(); /** * Unlock the mutex. */ void unlock(); /** * Pause the calling thread. Will be awoken when signal() or broadcast() is called. * Must be called while lock() is held (but gives it up while waiting). Once awoken, * the calling thread will hold the lock once again. */ void wait(); /** * Wake one thread waiting on this condition. Must be called while lock() * is held. */ void signal(); /** * Wake all threads waiting on this condition. Must be called while lock() * is held. */ void broadcast(); private: #ifdef SK_USE_POSIX_THREADS pthread_mutex_t fMutex; pthread_cond_t fCond; #elif defined(SK_BUILD_FOR_WIN32) CRITICAL_SECTION fCriticalSection; CONDITION_VARIABLE fCondition; #endif }; #endif