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