//===-- ThreadSafeValue.h ---------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef liblldb_ThreadSafeValue_h_ #define liblldb_ThreadSafeValue_h_ // C Includes // C++ Includes // Other libraries and framework includes // Project includes #include "lldb/Host/Mutex.h" namespace lldb_private { template class ThreadSafeValue { public: //------------------------------------------------------------------ // Constructors and Destructors //------------------------------------------------------------------ ThreadSafeValue() : m_value (), m_mutex (Mutex::eMutexTypeRecursive) { } ThreadSafeValue(const T& value) : m_value (value), m_mutex (Mutex::eMutexTypeRecursive) { } ~ThreadSafeValue() { } T GetValue () const { T value; { Mutex::Locker locker(m_mutex); value = m_value; } return value; } // Call this if you have already manually locked the mutex using the // GetMutex() accessor const T& GetValueNoLock () const { return m_value; } void SetValue (const T& value) { Mutex::Locker locker(m_mutex); m_value = value; } // Call this if you have already manually locked the mutex using the // GetMutex() accessor void SetValueNoLock (const T& value) { m_value = value; } Mutex & GetMutex () { return m_mutex; } private: T m_value; mutable Mutex m_mutex; //------------------------------------------------------------------ // For ThreadSafeValue only //------------------------------------------------------------------ DISALLOW_COPY_AND_ASSIGN (ThreadSafeValue); }; } // namespace lldb_private #endif // liblldb_ThreadSafeValue_h_