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#include "SkCondVar.h"
9363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
10363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerSkCondVar::SkCondVar() {
11363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#ifdef SK_USE_POSIX_THREADS
12363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    pthread_mutex_init(&fMutex, NULL /* default mutex attr */);
13363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    pthread_cond_init(&fCond, NULL /* default cond attr */);
14363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#elif defined(SK_BUILD_FOR_WIN32)
15363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    InitializeCriticalSection(&fCriticalSection);
16363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    InitializeConditionVariable(&fCondition);
17363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#endif
18363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger}
19363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
20363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerSkCondVar::~SkCondVar() {
21363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#ifdef SK_USE_POSIX_THREADS
22363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    pthread_mutex_destroy(&fMutex);
23363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    pthread_cond_destroy(&fCond);
24363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#elif defined(SK_BUILD_FOR_WIN32)
25363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    DeleteCriticalSection(&fCriticalSection);
26363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    // No need to clean up fCondition.
27363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#endif
28363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger}
29363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
30363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergervoid SkCondVar::lock() {
31363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#ifdef SK_USE_POSIX_THREADS
32363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    pthread_mutex_lock(&fMutex);
33363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#elif defined(SK_BUILD_FOR_WIN32)
34363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    EnterCriticalSection(&fCriticalSection);
35363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#endif
36363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger}
37363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
38363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergervoid SkCondVar::unlock() {
39363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#ifdef SK_USE_POSIX_THREADS
40363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    pthread_mutex_unlock(&fMutex);
41363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#elif defined(SK_BUILD_FOR_WIN32)
42363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    LeaveCriticalSection(&fCriticalSection);
43363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#endif
44363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger}
45363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
46363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergervoid SkCondVar::wait() {
47363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#ifdef SK_USE_POSIX_THREADS
48363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    pthread_cond_wait(&fCond, &fMutex);
49363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#elif defined(SK_BUILD_FOR_WIN32)
50363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    SleepConditionVariableCS(&fCondition, &fCriticalSection, INFINITE);
51363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#endif
52363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger}
53363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
54363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergervoid SkCondVar::signal() {
55363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#ifdef SK_USE_POSIX_THREADS
56363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    pthread_cond_signal(&fCond);
57363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#elif defined(SK_BUILD_FOR_WIN32)
58363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    WakeConditionVariable(&fCondition);
59363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#endif
60363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger}
61363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
62363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergervoid SkCondVar::broadcast() {
63363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#ifdef SK_USE_POSIX_THREADS
64363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    pthread_cond_broadcast(&fCond);
65363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#elif defined(SK_BUILD_FOR_WIN32)
66363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    WakeAllConditionVariable(&fCondition);
67363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#endif
68363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger}
69