blob: 5d001c0eddbf14b1cdf4affffd35e33eae47e075 [file] [log] [blame]
scroggo@google.com4177ef42012-10-31 15:52:16 +00001/*
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#include "SkCondVar.h"
9
10SkCondVar::SkCondVar() {
scroggo@google.com4d3c2812012-10-31 19:29:13 +000011#ifdef SK_USE_POSIX_THREADS
scroggo@google.com4177ef42012-10-31 15:52:16 +000012 pthread_mutex_init(&fMutex, NULL /* default mutex attr */);
13 pthread_cond_init(&fCond, NULL /* default cond attr */);
scroggo@google.com4d3c2812012-10-31 19:29:13 +000014#elif defined(SK_BUILD_FOR_WIN32)
15 InitializeCriticalSection(&fCriticalSection);
16 InitializeConditionVariable(&fCondition);
17#endif
scroggo@google.com4177ef42012-10-31 15:52:16 +000018}
19
20SkCondVar::~SkCondVar() {
scroggo@google.com4d3c2812012-10-31 19:29:13 +000021#ifdef SK_USE_POSIX_THREADS
scroggo@google.com4177ef42012-10-31 15:52:16 +000022 pthread_mutex_destroy(&fMutex);
23 pthread_cond_destroy(&fCond);
scroggo@google.com4d3c2812012-10-31 19:29:13 +000024#elif defined(SK_BUILD_FOR_WIN32)
25 DeleteCriticalSection(&fCriticalSection);
26 // No need to clean up fCondition.
27#endif
scroggo@google.com4177ef42012-10-31 15:52:16 +000028}
29
30void SkCondVar::lock() {
scroggo@google.com4d3c2812012-10-31 19:29:13 +000031#ifdef SK_USE_POSIX_THREADS
scroggo@google.com4177ef42012-10-31 15:52:16 +000032 pthread_mutex_lock(&fMutex);
scroggo@google.com4d3c2812012-10-31 19:29:13 +000033#elif defined(SK_BUILD_FOR_WIN32)
34 EnterCriticalSection(&fCriticalSection);
35#endif
scroggo@google.com4177ef42012-10-31 15:52:16 +000036}
37
38void SkCondVar::unlock() {
scroggo@google.com4d3c2812012-10-31 19:29:13 +000039#ifdef SK_USE_POSIX_THREADS
scroggo@google.com4177ef42012-10-31 15:52:16 +000040 pthread_mutex_unlock(&fMutex);
scroggo@google.com4d3c2812012-10-31 19:29:13 +000041#elif defined(SK_BUILD_FOR_WIN32)
42 LeaveCriticalSection(&fCriticalSection);
43#endif
scroggo@google.com4177ef42012-10-31 15:52:16 +000044}
45
46void SkCondVar::wait() {
scroggo@google.com4d3c2812012-10-31 19:29:13 +000047#ifdef SK_USE_POSIX_THREADS
scroggo@google.com4177ef42012-10-31 15:52:16 +000048 pthread_cond_wait(&fCond, &fMutex);
scroggo@google.com4d3c2812012-10-31 19:29:13 +000049#elif defined(SK_BUILD_FOR_WIN32)
50 SleepConditionVariableCS(&fCondition, &fCriticalSection, INFINITE);
51#endif
scroggo@google.com4177ef42012-10-31 15:52:16 +000052}
53
54void SkCondVar::signal() {
scroggo@google.com4d3c2812012-10-31 19:29:13 +000055#ifdef SK_USE_POSIX_THREADS
scroggo@google.com4177ef42012-10-31 15:52:16 +000056 pthread_cond_signal(&fCond);
scroggo@google.com4d3c2812012-10-31 19:29:13 +000057#elif defined(SK_BUILD_FOR_WIN32)
58 WakeConditionVariable(&fCondition);
59#endif
scroggo@google.com4177ef42012-10-31 15:52:16 +000060}
61
62void SkCondVar::broadcast() {
scroggo@google.com4d3c2812012-10-31 19:29:13 +000063#ifdef SK_USE_POSIX_THREADS
scroggo@google.com4177ef42012-10-31 15:52:16 +000064 pthread_cond_broadcast(&fCond);
scroggo@google.com4d3c2812012-10-31 19:29:13 +000065#elif defined(SK_BUILD_FOR_WIN32)
66 WakeAllConditionVariable(&fCondition);
67#endif
scroggo@google.com4177ef42012-10-31 15:52:16 +000068}