• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===-- ThreadSafeValue.h ---------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #ifndef liblldb_ThreadSafeValue_h_
11 #define liblldb_ThreadSafeValue_h_
12 
13 // C Includes
14 // C++ Includes
15 // Other libraries and framework includes
16 // Project includes
17 #include "lldb/Host/Mutex.h"
18 
19 namespace lldb_private {
20 
21 template <class T>
22 class ThreadSafeValue
23 {
24 public:
25     //------------------------------------------------------------------
26     // Constructors and Destructors
27     //------------------------------------------------------------------
ThreadSafeValue()28     ThreadSafeValue() :
29         m_value (),
30         m_mutex (Mutex::eMutexTypeRecursive)
31     {
32     }
33 
ThreadSafeValue(const T & value)34     ThreadSafeValue(const T& value) :
35         m_value (value),
36         m_mutex (Mutex::eMutexTypeRecursive)
37     {
38     }
39 
~ThreadSafeValue()40     ~ThreadSafeValue()
41     {
42     }
43 
44     T
GetValue()45     GetValue () const
46     {
47         T value;
48         {
49             Mutex::Locker locker(m_mutex);
50             value = m_value;
51         }
52         return value;
53     }
54 
55     // Call this if you have already manually locked the mutex using the
56     // GetMutex() accessor
57     const T&
GetValueNoLock()58     GetValueNoLock () const
59     {
60         return m_value;
61     }
62 
63     void
SetValue(const T & value)64     SetValue (const T& value)
65     {
66         Mutex::Locker locker(m_mutex);
67         m_value = value;
68     }
69 
70     // Call this if you have already manually locked the mutex using the
71     // GetMutex() accessor
72     void
SetValueNoLock(const T & value)73     SetValueNoLock (const T& value)
74     {
75         m_value = value;
76     }
77 
78     Mutex &
GetMutex()79     GetMutex ()
80     {
81         return m_mutex;
82     }
83 
84 private:
85     T m_value;
86     mutable Mutex m_mutex;
87 
88     //------------------------------------------------------------------
89     // For ThreadSafeValue only
90     //------------------------------------------------------------------
91     DISALLOW_COPY_AND_ASSIGN (ThreadSafeValue);
92 };
93 
94 
95 } // namespace lldb_private
96 #endif  // liblldb_ThreadSafeValue_h_
97