124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ThreadSafeValue.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_ThreadSafeValue_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_ThreadSafeValue_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Host/Mutex.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnertemplate <class T>
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass ThreadSafeValue
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Constructors and Destructors
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ThreadSafeValue() :
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_value (),
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_mutex (Mutex::eMutexTypeRecursive)
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ThreadSafeValue(const T& value) :
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_value (value),
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_mutex (Mutex::eMutexTypeRecursive)
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~ThreadSafeValue()
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    T
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetValue () const
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        T value;
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Mutex::Locker locker(m_mutex);
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            value = m_value;
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return value;
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Call this if you have already manually locked the mutex using the
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // GetMutex() accessor
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const T&
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetValueNoLock () const
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_value;
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetValue (const T& value)
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Mutex::Locker locker(m_mutex);
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_value = value;
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Call this if you have already manually locked the mutex using the
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // GetMutex() accessor
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetValueNoLock (const T& value)
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_value = value;
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex &
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetMutex ()
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_mutex;
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    T m_value;
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    mutable Mutex m_mutex;
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // For ThreadSafeValue only
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DISALLOW_COPY_AND_ASSIGN (ThreadSafeValue);
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_ThreadSafeValue_h_
97