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