Condition.cpp revision 263363
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#ifndef _WIN32 19 20//---------------------------------------------------------------------- 21// Default constructor 22// 23// The default constructor will initialize a new pthread condition 24// and maintain the condition in the object state. 25//---------------------------------------------------------------------- 26Condition::Condition () : 27 m_condition() 28{ 29 ::pthread_cond_init (&m_condition, NULL); 30} 31 32//---------------------------------------------------------------------- 33// Destructor 34// 35// Destroys the pthread condition that the object owns. 36//---------------------------------------------------------------------- 37Condition::~Condition () 38{ 39 ::pthread_cond_destroy (&m_condition); 40} 41 42//---------------------------------------------------------------------- 43// Unblock all threads waiting for a condition variable 44//---------------------------------------------------------------------- 45int 46Condition::Broadcast () 47{ 48 return ::pthread_cond_broadcast (&m_condition); 49} 50 51//---------------------------------------------------------------------- 52// Unblocks one thread waiting for the condition variable 53//---------------------------------------------------------------------- 54int 55Condition::Signal () 56{ 57 return ::pthread_cond_signal (&m_condition); 58} 59 60/* convert struct timeval to ms(milliseconds) */ 61static unsigned long int tv2ms(struct timeval a) { 62 return ((a.tv_sec * 1000) + (a.tv_usec / 1000)); 63} 64 65//---------------------------------------------------------------------- 66// The Wait() function atomically blocks the current thread 67// waiting on the owned condition variable, and unblocks the mutex 68// specified by "mutex". The waiting thread unblocks only after 69// another thread calls Signal(), or Broadcast() with the same 70// condition variable, or if "abstime" is valid (non-NULL) this 71// function will return when the system time reaches the time 72// specified in "abstime". If "abstime" is NULL this function will 73// wait for an infinite amount of time for the condition variable 74// to be signaled or broadcasted. 75// 76// The current thread re-acquires the lock on "mutex". 77//---------------------------------------------------------------------- 78int 79Condition::Wait (Mutex &mutex, const TimeValue *abstime, bool *timed_out) 80{ 81 int err = 0; 82 do 83 { 84 if (abstime && abstime->IsValid()) 85 { 86 struct timespec abstime_ts = abstime->GetAsTimeSpec(); 87 err = ::pthread_cond_timedwait (&m_condition, mutex.GetMutex(), &abstime_ts); 88 } 89 else 90 err = ::pthread_cond_wait (&m_condition, mutex.GetMutex()); 91 } while (err == EINTR); 92 93 if (timed_out != NULL) 94 { 95 if (err == ETIMEDOUT) 96 *timed_out = true; 97 else 98 *timed_out = false; 99 } 100 101 return err; 102} 103 104#endif 105 106//---------------------------------------------------------------------- 107// Get accessor to the pthread condition object 108//---------------------------------------------------------------------- 109lldb::condition_t * 110Condition::GetCondition() 111{ 112 return &m_condition; 113} 114