1 /* 2 * Copyright 2012 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef SkCondVar_DEFINED 9 #define SkCondVar_DEFINED 10 11 /** 12 * Import any thread model setting from configuration files. 13 */ 14 #include "SkTypes.h" 15 16 #ifdef SK_USE_POSIX_THREADS 17 #include <pthread.h> 18 #elif defined(SK_BUILD_FOR_WIN32) 19 #include <windows.h> 20 #else 21 /** 22 * Warn if the implementation of this class is empty, i.e. thread safety is not working. 23 */ 24 #warning "Thread safety class SkCondVar has no implementation!" 25 #endif 26 27 /** 28 * Condition variable for blocking access to shared data from other threads and 29 * controlling which threads are awake. 30 * 31 * Currently only supported on platforms with posix threads and Windows Vista and 32 * above. 33 */ 34 class SkCondVar { 35 public: 36 SkCondVar(); 37 ~SkCondVar(); 38 39 /** 40 * Lock a mutex. Must be done before calling the other functions on this object. 41 */ 42 void lock(); 43 44 /** 45 * Unlock the mutex. 46 */ 47 void unlock(); 48 49 /** 50 * Pause the calling thread. Will be awoken when signal() or broadcast() is called. 51 * Must be called while lock() is held (but gives it up while waiting). Once awoken, 52 * the calling thread will hold the lock once again. 53 */ 54 void wait(); 55 56 /** 57 * Wake one thread waiting on this condition. Must be called while lock() 58 * is held. 59 */ 60 void signal(); 61 62 /** 63 * Wake all threads waiting on this condition. Must be called while lock() 64 * is held. 65 */ 66 void broadcast(); 67 68 private: 69 #ifdef SK_USE_POSIX_THREADS 70 pthread_mutex_t fMutex; 71 pthread_cond_t fCond; 72 #elif defined(SK_BUILD_FOR_WIN32) 73 CRITICAL_SECTION fCriticalSection; 74 CONDITION_VARIABLE fCondition; 75 #endif 76 }; 77 78 #endif 79