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