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#ifndef SkCondVar_DEFINED 9363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#define SkCondVar_DEFINED 10363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 11363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#ifdef SK_USE_POSIX_THREADS 12363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include <pthread.h> 13363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#elif defined(SK_BUILD_FOR_WIN32) 14910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger#include <windows.h> 15363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#endif 16363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 17363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger/** 18363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Condition variable for blocking access to shared data from other threads and 19363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * controlling which threads are awake. 20363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * 21363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Currently only supported on platforms with posix threads and Windows Vista and 22363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * above. 23363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger */ 24363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass SkCondVar { 25363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerpublic: 26363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkCondVar(); 27363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger ~SkCondVar(); 28363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 29363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger /** 30363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Lock a mutex. Must be done before calling the other functions on this object. 31363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger */ 32363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger void lock(); 33363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 34363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger /** 35363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Unlock the mutex. 36363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger */ 37363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger void unlock(); 38363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 39363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger /** 40363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Pause the calling thread. Will be awoken when signal() or broadcast() is called. 41363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Must be called while lock() is held (but gives it up while waiting). Once awoken, 42363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * the calling thread will hold the lock once again. 43363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger */ 44363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger void wait(); 45363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 46363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger /** 47363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Wake one thread waiting on this condition. Must be called while lock() 48363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * is held. 49363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger */ 50363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger void signal(); 51363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 52363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger /** 53363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Wake all threads waiting on this condition. Must be called while lock() 54363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * is held. 55363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger */ 56363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger void broadcast(); 57363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 58363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprivate: 59363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#ifdef SK_USE_POSIX_THREADS 60363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger pthread_mutex_t fMutex; 61363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger pthread_cond_t fCond; 62363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#elif defined(SK_BUILD_FOR_WIN32) 63363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger CRITICAL_SECTION fCriticalSection; 64363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger CONDITION_VARIABLE fCondition; 65363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#endif 66363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger}; 67363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 68363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#endif 69