112634136a8876652990cf4d91aece7701742d7fdscroggo@google.com/* 212634136a8876652990cf4d91aece7701742d7fdscroggo@google.com * Copyright 2012 Google Inc. 312634136a8876652990cf4d91aece7701742d7fdscroggo@google.com * 412634136a8876652990cf4d91aece7701742d7fdscroggo@google.com * Use of this source code is governed by a BSD-style license that can be 512634136a8876652990cf4d91aece7701742d7fdscroggo@google.com * found in the LICENSE file. 612634136a8876652990cf4d91aece7701742d7fdscroggo@google.com */ 712634136a8876652990cf4d91aece7701742d7fdscroggo@google.com 812634136a8876652990cf4d91aece7701742d7fdscroggo@google.com#ifndef SkCondVar_DEFINED 912634136a8876652990cf4d91aece7701742d7fdscroggo@google.com#define SkCondVar_DEFINED 1012634136a8876652990cf4d91aece7701742d7fdscroggo@google.com 110b75d7d11707d5245e04f425a1cb0807c9f67e61scroggo@google.com#ifdef SK_USE_POSIX_THREADS 1212634136a8876652990cf4d91aece7701742d7fdscroggo@google.com#include <pthread.h> 130b75d7d11707d5245e04f425a1cb0807c9f67e61scroggo@google.com#elif defined(SK_BUILD_FOR_WIN32) 140b75d7d11707d5245e04f425a1cb0807c9f67e61scroggo@google.com#include <Windows.h> 150b75d7d11707d5245e04f425a1cb0807c9f67e61scroggo@google.com#endif 1612634136a8876652990cf4d91aece7701742d7fdscroggo@google.com 170b75d7d11707d5245e04f425a1cb0807c9f67e61scroggo@google.com/** 180b75d7d11707d5245e04f425a1cb0807c9f67e61scroggo@google.com * Condition variable for blocking access to shared data from other threads and 190b75d7d11707d5245e04f425a1cb0807c9f67e61scroggo@google.com * controlling which threads are awake. 200b75d7d11707d5245e04f425a1cb0807c9f67e61scroggo@google.com * 210b75d7d11707d5245e04f425a1cb0807c9f67e61scroggo@google.com * Currently only supported on platforms with posix threads and Windows Vista and 220b75d7d11707d5245e04f425a1cb0807c9f67e61scroggo@google.com * above. 230b75d7d11707d5245e04f425a1cb0807c9f67e61scroggo@google.com */ 2412634136a8876652990cf4d91aece7701742d7fdscroggo@google.comclass SkCondVar { 2512634136a8876652990cf4d91aece7701742d7fdscroggo@google.compublic: 2612634136a8876652990cf4d91aece7701742d7fdscroggo@google.com SkCondVar(); 2712634136a8876652990cf4d91aece7701742d7fdscroggo@google.com ~SkCondVar(); 2812634136a8876652990cf4d91aece7701742d7fdscroggo@google.com 290b75d7d11707d5245e04f425a1cb0807c9f67e61scroggo@google.com /** 300b75d7d11707d5245e04f425a1cb0807c9f67e61scroggo@google.com * Lock a mutex. Must be done before calling the other functions on this object. 310b75d7d11707d5245e04f425a1cb0807c9f67e61scroggo@google.com */ 3212634136a8876652990cf4d91aece7701742d7fdscroggo@google.com void lock(); 330b75d7d11707d5245e04f425a1cb0807c9f67e61scroggo@google.com 340b75d7d11707d5245e04f425a1cb0807c9f67e61scroggo@google.com /** 350b75d7d11707d5245e04f425a1cb0807c9f67e61scroggo@google.com * Unlock the mutex. 360b75d7d11707d5245e04f425a1cb0807c9f67e61scroggo@google.com */ 3712634136a8876652990cf4d91aece7701742d7fdscroggo@google.com void unlock(); 3812634136a8876652990cf4d91aece7701742d7fdscroggo@google.com 3912634136a8876652990cf4d91aece7701742d7fdscroggo@google.com /** 400b75d7d11707d5245e04f425a1cb0807c9f67e61scroggo@google.com * Pause the calling thread. Will be awoken when signal() or broadcast() is called. 410b75d7d11707d5245e04f425a1cb0807c9f67e61scroggo@google.com * Must be called while lock() is held (but gives it up while waiting). Once awoken, 420b75d7d11707d5245e04f425a1cb0807c9f67e61scroggo@google.com * the calling thread will hold the lock once again. 4312634136a8876652990cf4d91aece7701742d7fdscroggo@google.com */ 4412634136a8876652990cf4d91aece7701742d7fdscroggo@google.com void wait(); 4512634136a8876652990cf4d91aece7701742d7fdscroggo@google.com 4612634136a8876652990cf4d91aece7701742d7fdscroggo@google.com /** 4712634136a8876652990cf4d91aece7701742d7fdscroggo@google.com * Wake one thread waiting on this condition. Must be called while lock() 4812634136a8876652990cf4d91aece7701742d7fdscroggo@google.com * is held. 4912634136a8876652990cf4d91aece7701742d7fdscroggo@google.com */ 5012634136a8876652990cf4d91aece7701742d7fdscroggo@google.com void signal(); 5112634136a8876652990cf4d91aece7701742d7fdscroggo@google.com 5212634136a8876652990cf4d91aece7701742d7fdscroggo@google.com /** 5312634136a8876652990cf4d91aece7701742d7fdscroggo@google.com * Wake all threads waiting on this condition. Must be called while lock() 5412634136a8876652990cf4d91aece7701742d7fdscroggo@google.com * is held. 5512634136a8876652990cf4d91aece7701742d7fdscroggo@google.com */ 5612634136a8876652990cf4d91aece7701742d7fdscroggo@google.com void broadcast(); 5712634136a8876652990cf4d91aece7701742d7fdscroggo@google.com 5812634136a8876652990cf4d91aece7701742d7fdscroggo@google.comprivate: 590b75d7d11707d5245e04f425a1cb0807c9f67e61scroggo@google.com#ifdef SK_USE_POSIX_THREADS 6012634136a8876652990cf4d91aece7701742d7fdscroggo@google.com pthread_mutex_t fMutex; 6112634136a8876652990cf4d91aece7701742d7fdscroggo@google.com pthread_cond_t fCond; 620b75d7d11707d5245e04f425a1cb0807c9f67e61scroggo@google.com#elif defined(SK_BUILD_FOR_WIN32) 630b75d7d11707d5245e04f425a1cb0807c9f67e61scroggo@google.com CRITICAL_SECTION fCriticalSection; 640b75d7d11707d5245e04f425a1cb0807c9f67e61scroggo@google.com CONDITION_VARIABLE fCondition; 650b75d7d11707d5245e04f425a1cb0807c9f67e61scroggo@google.com#endif 6612634136a8876652990cf4d91aece7701742d7fdscroggo@google.com}; 6712634136a8876652990cf4d91aece7701742d7fdscroggo@google.com 6812634136a8876652990cf4d91aece7701742d7fdscroggo@google.com#endif 69