]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - contrib/llvm/tools/lldb/include/lldb/Utility/RefCounter.h
Copy head (r256279) to stable/10 as part of the 10.0-RELEASE cycle.
[FreeBSD/stable/10.git] / contrib / llvm / tools / lldb / include / lldb / Utility / RefCounter.h
1 //===-- RefCounter.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_RefCounter_h_
11 #define liblldb_RefCounter_h_
12
13 #include "lldb/lldb-public.h"
14
15 namespace lldb_utility {
16
17 //----------------------------------------------------------------------
18 // A simple reference counter object. You need an uint32_t* to use it
19 // Once that is in place, everyone who needs to ref-count, can say
20 // RefCounter ref(ptr);
21 // (of course, the pointer is a shared resource, and must be accessible to
22 // everyone who needs it). Synchronization is handled by RefCounter itself
23 // The counter is decreased each time a RefCounter to it goes out of scope
24 //----------------------------------------------------------------------
25 class RefCounter
26 {
27 public:
28     typedef uint32_t value_type;
29     
30     RefCounter(value_type* ctr);
31     
32     ~RefCounter();
33     
34 private:
35     value_type* m_counter;
36     DISALLOW_COPY_AND_ASSIGN (RefCounter);
37     
38     template <class T>
39     inline T
40     increment(T* t)
41     {
42         return __sync_fetch_and_add(t, 1);
43     }
44     
45     template <class T>
46     inline T
47     decrement(T* t)
48     {
49         return __sync_fetch_and_add(t, -1);
50     }
51     
52 };
53
54 } // namespace lldb_utility
55
56 #endif // #ifndef liblldb_RefCounter_h_