blob: 4e93db766dbe64bff1676cd46854e2fbfbad21b1 [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- 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 owend 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 (pthread_mutex_t *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, &abstime_ts);
90 }
91 else
92 err = ::pthread_cond_wait (&m_condition, mutex);
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