Home | History | Annotate | Download | only in utils
      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 #ifdef SK_USE_POSIX_THREADS
     12 #include <pthread.h>
     13 #elif defined(SK_BUILD_FOR_WIN32)
     14 #include <Windows.h>
     15 #endif
     16 
     17 /**
     18  * Condition variable for blocking access to shared data from other threads and
     19  * controlling which threads are awake.
     20  *
     21  * Currently only supported on platforms with posix threads and Windows Vista and
     22  * above.
     23  */
     24 class SkCondVar {
     25 public:
     26     SkCondVar();
     27     ~SkCondVar();
     28 
     29     /**
     30      * Lock a mutex. Must be done before calling the other functions on this object.
     31      */
     32     void lock();
     33 
     34     /**
     35      * Unlock the mutex.
     36      */
     37     void unlock();
     38 
     39     /**
     40      * Pause the calling thread. Will be awoken when signal() or broadcast() is called.
     41      * Must be called while lock() is held (but gives it up while waiting). Once awoken,
     42      * the calling thread will hold the lock once again.
     43      */
     44     void wait();
     45 
     46     /**
     47      * Wake one thread waiting on this condition. Must be called while lock()
     48      * is held.
     49      */
     50     void signal();
     51 
     52     /**
     53      * Wake all threads waiting on this condition. Must be called while lock()
     54      * is held.
     55      */
     56     void broadcast();
     57 
     58 private:
     59 #ifdef SK_USE_POSIX_THREADS
     60     pthread_mutex_t  fMutex;
     61     pthread_cond_t   fCond;
     62 #elif defined(SK_BUILD_FOR_WIN32)
     63     CRITICAL_SECTION   fCriticalSection;
     64     CONDITION_VARIABLE fCondition;
     65 #endif
     66 };
     67 
     68 #endif
     69