Fixes for VS 2008
[dyninst.git] / external / boost / detail / atomic_count.hpp
1 #ifndef BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED\r
2 #define BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED\r
3 \r
4 // MS compatible compilers support #pragma once\r
5 \r
6 #if defined(_MSC_VER) && (_MSC_VER >= 1020)\r
7 # pragma once\r
8 #endif\r
9 \r
10 //\r
11 //  boost/detail/atomic_count.hpp - thread/SMP safe reference counter\r
12 //\r
13 //  Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd.\r
14 //\r
15 // Distributed under the Boost Software License, Version 1.0. (See\r
16 // accompanying file LICENSE_1_0.txt or copy at\r
17 // http://www.boost.org/LICENSE_1_0.txt)\r
18 //\r
19 //  typedef <implementation-defined> boost::detail::atomic_count;\r
20 //\r
21 //  atomic_count a(n);\r
22 //\r
23 //    (n is convertible to long)\r
24 //\r
25 //    Effects: Constructs an atomic_count with an initial value of n\r
26 //\r
27 //  a;\r
28 //\r
29 //    Returns: (long) the current value of a\r
30 //\r
31 //  ++a;\r
32 //\r
33 //    Effects: Atomically increments the value of a\r
34 //    Returns: nothing\r
35 //\r
36 //  --a;\r
37 //\r
38 //    Effects: Atomically decrements the value of a\r
39 //    Returns: (long) zero if the new value of a is zero,\r
40 //      unspecified non-zero value otherwise (usually the new value)\r
41 //\r
42 //    Important note: when --a returns zero, it must act as a\r
43 //      read memory barrier (RMB); i.e. the calling thread must\r
44 //      have a synchronized view of the memory\r
45 //\r
46 //    On Intel IA-32 (x86) memory is always synchronized, so this\r
47 //      is not a problem.\r
48 //\r
49 //    On many architectures the atomic instructions already act as\r
50 //      a memory barrier.\r
51 //\r
52 //    This property is necessary for proper reference counting, since\r
53 //      a thread can update the contents of a shared object, then\r
54 //      release its reference, and another thread may immediately\r
55 //      release the last reference causing object destruction.\r
56 //\r
57 //    The destructor needs to have a synchronized view of the\r
58 //      object to perform proper cleanup.\r
59 //\r
60 //    Original example by Alexander Terekhov:\r
61 //\r
62 //    Given:\r
63 //\r
64 //    - a mutable shared object OBJ;\r
65 //    - two threads THREAD1 and THREAD2 each holding \r
66 //      a private smart_ptr object pointing to that OBJ.\r
67 //\r
68 //    t1: THREAD1 updates OBJ (thread-safe via some synchronization)\r
69 //      and a few cycles later (after "unlock") destroys smart_ptr;\r
70 //\r
71 //    t2: THREAD2 destroys smart_ptr WITHOUT doing any synchronization \r
72 //      with respect to shared mutable object OBJ; OBJ destructors\r
73 //      are called driven by smart_ptr interface...\r
74 //\r
75 \r
76 #include <boost/config.hpp>\r
77 \r
78 #ifndef BOOST_HAS_THREADS\r
79 \r
80 namespace boost\r
81 {\r
82 \r
83 namespace detail\r
84 {\r
85 \r
86 typedef long atomic_count;\r
87 \r
88 }\r
89 \r
90 }\r
91 \r
92 #elif defined(BOOST_AC_USE_PTHREADS)\r
93 #  include <boost/detail/atomic_count_pthreads.hpp>\r
94 \r
95 #elif defined( __GNUC__ ) && ( defined( __i386__ ) || defined( __x86_64__ ) )\r
96 # include <boost/detail/atomic_count_gcc_x86.hpp>\r
97 \r
98 #elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__)\r
99 #  include <boost/detail/atomic_count_win32.hpp>\r
100 \r
101 #elif defined( __GNUC__ ) && ( __GNUC__ * 100 + __GNUC_MINOR__ >= 401 ) && !defined( __arm__ ) && !defined( __hppa ) && ( !defined( __INTEL_COMPILER ) || defined( __ia64__ ) )\r
102 #  include <boost/detail/atomic_count_sync.hpp>\r
103 \r
104 #elif defined(__GLIBCPP__) || defined(__GLIBCXX__)\r
105 #  include <boost/detail/atomic_count_gcc.hpp>\r
106 \r
107 #elif defined(BOOST_HAS_PTHREADS)\r
108 \r
109 #  define BOOST_AC_USE_PTHREADS\r
110 #  include <boost/detail/atomic_count_pthreads.hpp>\r
111 \r
112 #else\r
113 \r
114 // Use #define BOOST_DISABLE_THREADS to avoid the error\r
115 #error Unrecognized threading platform\r
116 \r
117 #endif\r
118 \r
119 #endif // #ifndef BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED\r