Predicate.h revision 8533e994d3076ef517e2cf7f3030bbc6a7273a9b
1663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng//===-- Predicate.h ---------------------------------------------*- C++ -*-===//
2663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng//
3663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng//                     The LLVM Compiler Infrastructure
4663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng//
5663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng// This file is distributed under the University of Illinois Open Source
6663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng// License. See LICENSE.TXT for details.
7663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng//
8663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng//===----------------------------------------------------------------------===//
9663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#ifndef liblldb_Predicate_h_
11663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define liblldb_Predicate_h_
12663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if defined(__cplusplus)
13663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include "lldb/Host/Mutex.h"
15663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include "lldb/Host/Condition.h"
16663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <stdint.h>
17663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <time.h>
18663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
19663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng//#define DB_PTHREAD_LOG_EVENTS
20663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
21663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng//----------------------------------------------------------------------
22663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/// Enumerations for broadcasting.
23663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng//----------------------------------------------------------------------
24663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengnamespace lldb_private {
25663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
26663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef enum
27663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
28663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    eBroadcastNever,    ///< No broadcast will be sent when the value is modified.
29663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    eBroadcastAlways,   ///< Always send a broadcast when the value is modified.
30663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    eBroadcastOnChange  ///< Only broadcast if the value changes when the value is modified.
31663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
32663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} PredicateBroadcastType;
33663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
34663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng//----------------------------------------------------------------------
35663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/// @class Predicate Predicate.h "lldb/Host/Predicate.h"
36663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/// @brief A C++ wrapper class for providing threaded access to a value
37663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/// of type T.
38663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng///
39663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/// A templatized class that provides multi-threaded access to a value
40663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/// of type T. Threads can efficiently wait for bits within T to be set
41663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/// or reset, or wait for T to be set to be equal/not equal to a
42663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/// specified values.
43663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng//----------------------------------------------------------------------
44663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtemplate <class T>
45663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengclass Predicate
46663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
47663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengpublic:
48663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
49663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    //------------------------------------------------------------------
50663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// Default constructor.
51663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
52663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// Initializes the mutex, condition and value with their default
53663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// constructors.
54663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    //------------------------------------------------------------------
55663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    Predicate () :
56663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        m_value(),
57663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        m_mutex(),
58663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        m_condition()
59663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    {
60663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    }
61663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
62436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    //------------------------------------------------------------------
63663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// Construct with initial T value \a initial_value.
64663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
65663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// Initializes the mutex and condition with their default
66663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// constructors, and initializes the value with \a initial_value.
67663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
68663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// @param[in] initial_value
69663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     The initial value for our T object.
70663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    //------------------------------------------------------------------
71663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    Predicate (T initial_value)  :
72663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        m_value(initial_value),
73663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        m_mutex(),
74663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        m_condition()
75663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    {
76663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    }
77663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
78663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    //------------------------------------------------------------------
79663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// Destructor.
80663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
81663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// Destrory the condition, mutex, and T objects.
82663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    //------------------------------------------------------------------
83663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ~Predicate ()
84663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    {
85663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    }
86663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
87663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
88663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    //------------------------------------------------------------------
89663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// Value get accessor.
90663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
91663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// Copies the current \a m_value in a thread safe manor and returns
92663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// the copied value.
93663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
94663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// @return
95663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     A copy of the current value.
96663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    //------------------------------------------------------------------
97663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    T
98663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    GetValue () const
99663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    {
100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        Mutex::Locker locker(m_mutex);
101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        T value = m_value;
102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        return value;
103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    }
104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    //------------------------------------------------------------------
106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// Value set accessor.
107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// Set the contained \a m_value to \a new_value in a thread safe
109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// way and broadcast if needed.
110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// @param[in] value
112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     The new value to set.
113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// @param[in] broadcast_type
115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     A value indicating when and if to broadast. See the
116663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     PredicateBroadcastType enumeration for details.
117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// @see Predicate::Broadcast()
119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    //------------------------------------------------------------------
120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    void
121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    SetValue (T value, PredicateBroadcastType broadcast_type)
122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    {
123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        Mutex::Locker locker(m_mutex);
124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifdef DB_PTHREAD_LOG_EVENTS
125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        printf("%s (value = 0x%8.8x, broadcast_type = %i)\n", __FUNCTION__, value, broadcast_type);
126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        const T old_value = m_value;
128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        m_value = value;
129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        Broadcast(old_value, broadcast_type);
131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    }
132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    //------------------------------------------------------------------
134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// Set some bits in \a m_value.
135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// Logically set the bits \a bits in the contained \a m_value in a
137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// thread safe way and broadcast if needed.
138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// @param[in] bits
140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     The bits to set in \a m_value.
141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// @param[in] broadcast_type
143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     A value indicating when and if to broadast. See the
144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     PredicateBroadcastType enumeration for details.
145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// @see Predicate::Broadcast()
147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    //------------------------------------------------------------------
148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    void
149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    SetValueBits (T bits, PredicateBroadcastType broadcast_type)
150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    {
151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        Mutex::Locker locker(m_mutex);
152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifdef DB_PTHREAD_LOG_EVENTS
153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        printf("%s (bits = 0x%8.8x, broadcast_type = %i)\n", __FUNCTION__, bits, broadcast_type);
154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        const T old_value = m_value;
156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        m_value |= bits;
157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        Broadcast(old_value, broadcast_type);
159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    }
160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    //------------------------------------------------------------------
162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// Reset some bits in \a m_value.
163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// Logically reset (clear) the bits \a bits in the contained
165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// \a m_value in a thread safe way and broadcast if needed.
166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// @param[in] bits
168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     The bits to clear in \a m_value.
169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// @param[in] broadcast_type
171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     A value indicating when and if to broadast. See the
172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     PredicateBroadcastType enumeration for details.
173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// @see Predicate::Broadcast()
175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    //------------------------------------------------------------------
176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    void
177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ResetValueBits (T bits, PredicateBroadcastType broadcast_type)
178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    {
179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        Mutex::Locker locker(m_mutex);
180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifdef DB_PTHREAD_LOG_EVENTS
181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        printf("%s (bits = 0x%8.8x, broadcast_type = %i)\n", __FUNCTION__, bits, broadcast_type);
182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        const T old_value = m_value;
184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        m_value &= ~bits;
185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        Broadcast(old_value, broadcast_type);
187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    }
188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    //------------------------------------------------------------------
190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// Wait for bits to be set in \a m_value.
191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// Waits in a thread safe way for any bits in \a bits to get
193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// logically set in \a m_value. If any bits are already set in
194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// \a m_value, this function will return without waiting.
195663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
196663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// @param[in] bits
197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     The bits we are waiting to be set in \a m_value.
198663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// @param[in] abstime
200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     If non-NULL, the absolute time at which we should stop
201663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     waiting, else wait an infinite amount of time.
202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// @return
204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     Any bits of the requested bits that actually were set within
205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     the time specified. Zero if a timeout or unrecoverable error
206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     occurred.
207663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    //------------------------------------------------------------------
208663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    T
209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    WaitForSetValueBits (T bits, const TimeValue *abstime = NULL)
210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    {
211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        int err = 0;
212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        // pthread_cond_timedwait() or pthread_cond_wait() will atomically
213663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        // unlock the mutex and wait for the condition to be set. When either
214663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        // function returns, they will re-lock the mutex. We use an auto lock/unlock
215663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        // class (Mutex::Locker) to allow us to return at any point in this
216663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        // function and not have to worry about unlocking the mutex.
217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        Mutex::Locker locker(m_mutex);
218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifdef DB_PTHREAD_LOG_EVENTS
219663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        printf("%s (bits = 0x%8.8x, abstime = %p), m_value = 0x%8.8x\n", __FUNCTION__, bits, abstime, m_value);
220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
221663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        while (err == 0 && ((m_value & bits) == 0))
222663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        {
223663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            err = m_condition.Wait (m_mutex, abstime);
224663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        }
225663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifdef DB_PTHREAD_LOG_EVENTS
226663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        printf("%s (bits = 0x%8.8x), m_value = 0x%8.8x, returning 0x%8.8x\n", __FUNCTION__, bits, m_value, m_value & bits);
227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        return m_value & bits;
230663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    }
231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    //------------------------------------------------------------------
233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// Wait for bits to be reset in \a m_value.
234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
235663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// Waits in a thread safe way for any bits in \a bits to get
236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// logically reset in \a m_value. If all bits are already reset in
237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// \a m_value, this function will return without waiting.
238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// @param[in] bits
240663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     The bits we are waiting to be reset in \a m_value.
241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// @param[in] abstime
243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     If non-NULL, the absolute time at which we should stop
244663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     waiting, else wait an infinite amount of time.
245663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
246663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// @return
247663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     Zero on successful waits, or non-zero if a timeout or
248663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     unrecoverable error occurs.
249663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    //------------------------------------------------------------------
250663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    T
251663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    WaitForResetValueBits (T bits, const TimeValue *abstime = NULL)
252663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    {
253663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        int err = 0;
254663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
255663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        // pthread_cond_timedwait() or pthread_cond_wait() will atomically
256663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        // unlock the mutex and wait for the condition to be set. When either
257663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        // function returns, they will re-lock the mutex. We use an auto lock/unlock
258663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        // class (Mutex::Locker) to allow us to return at any point in this
259663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        // function and not have to worry about unlocking the mutex.
260663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        Mutex::Locker locker(m_mutex);
261663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
262663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifdef DB_PTHREAD_LOG_EVENTS
263663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        printf("%s (bits = 0x%8.8x, abstime = %p), m_value = 0x%8.8x\n", __FUNCTION__, bits, abstime, m_value);
264663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
265663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        while (err == 0 && ((m_value & bits) != 0))
266663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        {
267663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            err = m_condition.Wait (m_mutex, abstime);
268663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        }
269663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
270663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifdef DB_PTHREAD_LOG_EVENTS
271663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        printf("%s (bits = 0x%8.8x), m_value = 0x%8.8x, returning 0x%8.8x\n", __FUNCTION__, bits, m_value, m_value & bits);
272663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
273663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        return m_value & bits;
274663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    }
275663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
276663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    //------------------------------------------------------------------
277663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// Wait for \a m_value to be equal to \a value.
278663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
279663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// Waits in a thread safe way for \a m_value to be equal to \a
280663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// value. If \a m_value is already equal to \a value, this
281663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// function will return without waiting.
282663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
283663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// @param[in] value
284663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     The value we want \a m_value to be equal to.
285663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
286663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// @param[in] abstime
287663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     If non-NULL, the absolute time at which we should stop
288663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     waiting, else wait an infinite amount of time.
289663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
290663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// @param[out] timed_out
291663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     If not null, set to true if we return because of a time out,
292663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     and false if the value was set.
293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
294663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// @return
295663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     @li \b true if the \a m_value is equal to \a value
296663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     @li \b false otherwise
297663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    //------------------------------------------------------------------
298663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    bool
299663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    WaitForValueEqualTo (T value, const TimeValue *abstime = NULL, bool *timed_out = NULL)
300663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    {
301663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        int err = 0;
302663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        // pthread_cond_timedwait() or pthread_cond_wait() will atomically
303663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        // unlock the mutex and wait for the condition to be set. When either
304663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        // function returns, they will re-lock the mutex. We use an auto lock/unlock
305663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        // class (Mutex::Locker) to allow us to return at any point in this
306663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        // function and not have to worry about unlocking the mutex.
307663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        Mutex::Locker locker(m_mutex);
308663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
309663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifdef DB_PTHREAD_LOG_EVENTS
310663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        printf("%s (value = 0x%8.8x, abstime = %p), m_value = 0x%8.8x\n", __FUNCTION__, value, abstime, m_value);
311663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
312663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        if (timed_out)
313663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            *timed_out = false;
314663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
315663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        while (err == 0 && m_value != value)
316663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        {
317663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            err = m_condition.Wait (m_mutex, abstime, timed_out);
318663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        }
319663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
320663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        return m_value == value;
321663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    }
322663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
323663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    bool
324663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    WaitForValueEqualToAndSetValueTo (T wait_value, T new_value, const TimeValue *abstime = NULL, bool *timed_out = NULL)
325663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    {
326663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        int err = 0;
327663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        // pthread_cond_timedwait() or pthread_cond_wait() will atomically
328663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        // unlock the mutex and wait for the condition to be set. When either
329663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        // function returns, they will re-lock the mutex. We use an auto lock/unlock
330663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        // class (Mutex::Locker) to allow us to return at any point in this
331663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        // function and not have to worry about unlocking the mutex.
332663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        Mutex::Locker locker(m_mutex);
333663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
334663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifdef DB_PTHREAD_LOG_EVENTS
335663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        printf("%s (wait_value = 0x%8.8x, new_value = 0x%8.8x, abstime = %p), m_value = 0x%8.8x\n", __FUNCTION__, wait_value, new_value, abstime, m_value);
336663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
337663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        if (timed_out)
338663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            *timed_out = false;
339663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
340663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        while (err == 0 && m_value != wait_value)
341663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        {
342663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            err = m_condition.Wait (m_mutex, abstime, timed_out);
343663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        }
344663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
345663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        if (m_value == wait_value)
346663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        {
347663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            m_value = new_value;
348663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            return true;
349663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        }
350663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
351663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        return false;
352663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    }
353663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
354663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
355663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    //------------------------------------------------------------------
356663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// Wait for \a m_value to not be equal to \a value.
357663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
358663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// Waits in a thread safe way for \a m_value to not be equal to \a
359663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// value. If \a m_value is already not equal to \a value, this
360663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// function will return without waiting.
361663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
362663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// @param[in] value
363663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     The value we want \a m_value to not be equal to.
364663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
365663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// @param[out] new_value
366663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     The new value if \b true is returned.
367663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///
368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    /// @param[in] abstime
369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    ///     If non-NULL, the absolute time at which we should stop
370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    ///     waiting, else wait an infinite amount of time.
371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    ///
372663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// @return
373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    ///     @li \b true if the \a m_value is equal to \a value
374663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    ///     @li \b false otherwise
375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    //------------------------------------------------------------------
376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    bool
377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    WaitForValueNotEqualTo (T value, T &new_value, const TimeValue *abstime = NULL)
378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    {
379663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        int err = 0;
380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        // pthread_cond_timedwait() or pthread_cond_wait() will atomically
381663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        // unlock the mutex and wait for the condition to be set. When either
382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        // function returns, they will re-lock the mutex. We use an auto lock/unlock
383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        // class (Mutex::Locker) to allow us to return at any point in this
384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        // function and not have to worry about unlocking the mutex.
385663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        Mutex::Locker locker(m_mutex);
386663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifdef DB_PTHREAD_LOG_EVENTS
387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        printf("%s (value = 0x%8.8x, abstime = %p), m_value = 0x%8.8x\n", __FUNCTION__, value, abstime, m_value);
388663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        while (err == 0 && m_value == value)
390663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        {
391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            err = m_condition.Wait (m_mutex, abstime);
392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        }
393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        if (m_value != value)
395663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        {
396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            new_value = m_value;
397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            return true;
398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        }
399663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        return false;
400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    }
401663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
402663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengprotected:
403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    //----------------------------------------------------------------------
404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    // pthread condition and mutex variable to controll access and allow
405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    // blocking between the main thread and the spotlight index thread.
406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    //----------------------------------------------------------------------
407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    T           m_value;        ///< The templatized value T that we are protecting access to
408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    mutable Mutex m_mutex;      ///< The mutex to use when accessing the data
409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    Condition   m_condition;    ///< The pthread condition variable to use for signaling that data available or changed.
410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovprivate:
412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    //------------------------------------------------------------------
414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    /// Broadcast if needed.
415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    ///
416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    /// Check to see if we need to broadcast to our condition variable
417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    /// depedning on the \a old_value and on the \a broadcast_type.
418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    ///
419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    /// If \a broadcast_type is eBroadcastNever, no broadcast will be
420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    /// sent.
421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    ///
422663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    /// If \a broadcast_type is eBroadcastAlways, the condition variable
423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    /// will always be broadcast.
424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    ///
425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    /// If \a broadcast_type is eBroadcastOnChange, the condition
426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    /// variable be broadcast if the owned value changes.
427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    //------------------------------------------------------------------
428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    void
429663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    Broadcast (T old_value, PredicateBroadcastType broadcast_type)
430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    {
431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        bool broadcast = (broadcast_type == eBroadcastAlways) || ((broadcast_type == eBroadcastOnChange) && old_value != m_value);
432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#ifdef DB_PTHREAD_LOG_EVENTS
433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        printf("%s (old_value = 0x%8.8x, broadcast_type = %i) m_value = 0x%8.8x, broadcast = %u\n", __FUNCTION__, old_value, broadcast_type, m_value, broadcast);
434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        if (broadcast)
436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            m_condition.Broadcast();
437663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    }
438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    DISALLOW_COPY_AND_ASSIGN(Predicate);
441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov};
442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} // namespace lldb_private
444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif  // #if defined(__cplusplus)
446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif // #ifndef liblldb_Predicate_h_
447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov