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