1//===-- Condition.cpp -------------------------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#include <errno.h> 11 12#include "lldb/Host/Condition.h" 13#include "lldb/Host/TimeValue.h" 14 15 16using namespace lldb_private; 17 18//---------------------------------------------------------------------- 19// Default constructor 20// 21// The default constructor will initialize a new pthread condition 22// and maintain the condition in the object state. 23//---------------------------------------------------------------------- 24Condition::Condition () : 25 m_condition() 26{ 27 ::pthread_cond_init (&m_condition, NULL); 28} 29 30//---------------------------------------------------------------------- 31// Destructor 32// 33// Destroys the pthread condition that the object owns. 34//---------------------------------------------------------------------- 35Condition::~Condition () 36{ 37 ::pthread_cond_destroy (&m_condition); 38} 39 40//---------------------------------------------------------------------- 41// Unblock all threads waiting for a condition variable 42//---------------------------------------------------------------------- 43int 44Condition::Broadcast () 45{ 46 return ::pthread_cond_broadcast (&m_condition); 47} 48 49//---------------------------------------------------------------------- 50// Get accessor to the pthread condition object 51//---------------------------------------------------------------------- 52pthread_cond_t * 53Condition::GetCondition () 54{ 55 return &m_condition; 56} 57 58//---------------------------------------------------------------------- 59// Unblocks one thread waiting for the condition variable 60//---------------------------------------------------------------------- 61int 62Condition::Signal () 63{ 64 return ::pthread_cond_signal (&m_condition); 65} 66 67//---------------------------------------------------------------------- 68// The Wait() function atomically blocks the current thread 69// waiting on the owned condition variable, and unblocks the mutex 70// specified by "mutex". The waiting thread unblocks only after 71// another thread calls Signal(), or Broadcast() with the same 72// condition variable, or if "abstime" is valid (non-NULL) this 73// function will return when the system time reaches the time 74// specified in "abstime". If "abstime" is NULL this function will 75// wait for an infinite amount of time for the condition variable 76// to be signaled or broadcasted. 77// 78// The current thread re-acquires the lock on "mutex". 79//---------------------------------------------------------------------- 80int 81Condition::Wait (Mutex &mutex, const TimeValue *abstime, bool *timed_out) 82{ 83 int err = 0; 84 do 85 { 86 if (abstime && abstime->IsValid()) 87 { 88 struct timespec abstime_ts = abstime->GetAsTimeSpec(); 89 err = ::pthread_cond_timedwait (&m_condition, mutex.GetMutex(), &abstime_ts); 90 } 91 else 92 err = ::pthread_cond_wait (&m_condition, mutex.GetMutex()); 93 } while (err == EINTR); 94 95 if (timed_out != NULL) 96 { 97 if (err == ETIMEDOUT) 98 *timed_out = true; 99 else 100 *timed_out = false; 101 } 102 103 104 return err; 105} 106 107