]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/llvm/tools/lldb/include/lldb/Core/ThreadSafeValue.h
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / llvm / tools / lldb / include / lldb / Core / ThreadSafeValue.h
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     //------------------------------------------------------------------
28     ThreadSafeValue() :
29         m_value (),
30         m_mutex (Mutex::eMutexTypeRecursive)
31     {
32     }
33
34     ThreadSafeValue(const T& value) :
35         m_value (value),
36         m_mutex (Mutex::eMutexTypeRecursive)
37     {
38     }
39
40     ~ThreadSafeValue()
41     {
42     }
43
44     T
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&
58     GetValueNoLock () const
59     {
60         return m_value;
61     }
62
63     void
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
73     SetValueNoLock (const T& value)
74     {
75         m_value = value;
76     }
77
78     Mutex &
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_