| // Copyright 2006-2008 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "base/base_wrapper.h" |
| #include "base/synchronization/condition_variable.h" |
| |
| #include "base/logging.h" |
| |
| namespace base { |
| |
| ConditionVariable::ConditionVariable(Lock* user_lock) |
| : user_mutex_(user_lock->lock_.native_handle()) |
| #ifndef NDEBUG |
| , user_lock_(user_lock) |
| #endif |
| { |
| int rv = 0; |
| rv = pthread_cond_init(&condition_, NULL); |
| DCHECK_EQ(0, rv); |
| } |
| |
| ConditionVariable::~ConditionVariable() { |
| int rv = pthread_cond_destroy(&condition_); |
| DCHECK_EQ(0, rv); |
| } |
| |
| void ConditionVariable::Wait() { |
| #ifndef NDEBUG |
| user_lock_->CheckHeldAndUnmark(); |
| #endif |
| int rv = pthread_cond_wait(&condition_, user_mutex_); |
| DCHECK_EQ(0, rv); |
| #ifndef NDEBUG |
| user_lock_->CheckUnheldAndMark(); |
| #endif |
| } |
| |
| void ConditionVariable::Broadcast() { |
| int rv = pthread_cond_broadcast(&condition_); |
| DCHECK_EQ(0, rv); |
| } |
| |
| void ConditionVariable::Signal() { |
| int rv = pthread_cond_signal(&condition_); |
| DCHECK_EQ(0, rv); |
| } |
| |
| } // namespace base |