124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Condition.h ---------------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef liblldb_DBCondition_h_ 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_DBCondition_h_ 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#if defined(__cplusplus) 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <pthread.h> 161b584ebc1de8b50fe375cffb5fb33ad13be10046Jim Ingham#include "lldb/Host/Mutex.h" 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private { 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass TimeValue; 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @class Condition Condition.h "lldb/Host/Condition.h" 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @brief A C++ wrapper class for pthread condition variables. 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// A class that wraps up a pthread condition (pthread_cond_t). The 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// class will create a pthread condition when an instance is 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// constructed, and detroy it when it is destructed. It also provides 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// access to the standard pthread condition calls. 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass Condition 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Default constructor 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The default constructor will initialize a new pthread condition 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// and maintain the condition in the object state. 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Condition (); 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Destructor 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Destroys the pthread condition that the object owns. 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~Condition (); 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Unblock all threads waiting for a condition variable 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The return value from \c pthread_cond_broadcast() 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Broadcast (); 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Unblocks one thread waiting for the condition variable 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The return value from \c pthread_cond_signal() 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Signal (); 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Wait for the condition variable to be signaled. 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The Wait() function atomically blocks the current thread 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// waiting on this object's condition variable, and unblocks 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \a mutex. The waiting thread unblocks only after another thread 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// signals or broadcasts this object's condition variable. 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// If \a abstime is non-NULL, this function will return when the 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// system time reaches the time specified in \a abstime if the 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// condition variable doesn't get unblocked. If \a abstime is NULL 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// this function will wait for an infinite amount of time for the 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// condition variable to be unblocked. 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The current thread re-acquires the lock on \a mutex following 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// the wait. 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] mutex 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The mutex to use in the \c pthread_cond_timedwait() or 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \c pthread_cond_wait() calls. 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] abstime 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// An absolute time at which to stop waiting if non-NULL, else 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// wait an infinite amount of time for the condition variable 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// toget signaled. 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[out] timed_out 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// If not NULL, will be set to true if the wait timed out, and 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // false otherwise. 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @see Condition::Broadcast() 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @see Condition::Signal() 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int 1021b584ebc1de8b50fe375cffb5fb33ad13be10046Jim Ingham Wait (Mutex &mutex, const TimeValue *abstime = NULL, bool *timed_out = NULL); 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected: 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Member variables 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pthread_cond_t m_condition; ///< The condition variable. 1091b584ebc1de8b50fe375cffb5fb33ad13be10046Jim Ingham 1101b584ebc1de8b50fe375cffb5fb33ad13be10046Jim Ingham //------------------------------------------------------------------ 1111b584ebc1de8b50fe375cffb5fb33ad13be10046Jim Ingham /// Get accessor to the pthread condition object. 1121b584ebc1de8b50fe375cffb5fb33ad13be10046Jim Ingham /// 1131b584ebc1de8b50fe375cffb5fb33ad13be10046Jim Ingham /// @return 1141b584ebc1de8b50fe375cffb5fb33ad13be10046Jim Ingham /// A pointer to the condition variable owned by this object. 1151b584ebc1de8b50fe375cffb5fb33ad13be10046Jim Ingham //------------------------------------------------------------------ 1161b584ebc1de8b50fe375cffb5fb33ad13be10046Jim Ingham pthread_cond_t * 1171b584ebc1de8b50fe375cffb5fb33ad13be10046Jim Ingham GetCondition (); 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif // #if defined(__cplusplus) 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 125