]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lldb/source/Host/common/Condition.cpp
MFV r277870
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / lldb / source / Host / common / Condition.cpp
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
16 using 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 //----------------------------------------------------------------------
26 Condition::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 //----------------------------------------------------------------------
37 Condition::~Condition ()
38 {
39     ::pthread_cond_destroy (&m_condition);
40 }
41
42 //----------------------------------------------------------------------
43 // Unblock all threads waiting for a condition variable
44 //----------------------------------------------------------------------
45 int
46 Condition::Broadcast ()
47 {
48     return ::pthread_cond_broadcast (&m_condition);
49 }
50
51 //----------------------------------------------------------------------
52 // Unblocks one thread waiting for the condition variable
53 //----------------------------------------------------------------------
54 int
55 Condition::Signal ()
56 {
57     return ::pthread_cond_signal (&m_condition);
58 }
59
60 //----------------------------------------------------------------------
61 // The Wait() function atomically blocks the current thread
62 // waiting on the owned condition variable, and unblocks the mutex
63 // specified by "mutex".  The waiting thread unblocks only after
64 // another thread calls Signal(), or Broadcast() with the same
65 // condition variable, or if "abstime" is valid (non-NULL) this
66 // function will return when the system time reaches the time
67 // specified in "abstime". If "abstime" is NULL this function will
68 // wait for an infinite amount of time for the condition variable
69 // to be signaled or broadcasted.
70 //
71 // The current thread re-acquires the lock on "mutex".
72 //----------------------------------------------------------------------
73 int
74 Condition::Wait (Mutex &mutex, const TimeValue *abstime, bool *timed_out)
75 {
76     int err = 0;
77     do
78     {
79         if (abstime && abstime->IsValid())
80         {
81             struct timespec abstime_ts = abstime->GetAsTimeSpec();
82             err = ::pthread_cond_timedwait (&m_condition, mutex.GetMutex(), &abstime_ts);
83         }
84         else
85             err = ::pthread_cond_wait (&m_condition, mutex.GetMutex());
86     } while (err == EINTR);
87
88     if (timed_out != NULL)
89     {
90         if (err == ETIMEDOUT)
91             *timed_out = true;
92         else
93             *timed_out = false;
94     }
95
96     return err;
97 }
98
99 #endif
100
101 //----------------------------------------------------------------------
102 // Get accessor to the pthread condition object
103 //----------------------------------------------------------------------
104 lldb::condition_t *
105 Condition::GetCondition()
106 {
107     return &m_condition;
108 }