fixing stuff
[dyninst.git] / dynutil / h / dyn_detail / boost / detail / atomic_count_pthreads.hpp
1 #ifndef DYN_DETAIL_BOOST_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED
2 #define DYN_DETAIL_BOOST_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED
3
4 //
5 //  boost/detail/atomic_count_pthreads.hpp
6 //
7 //  Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd.
8 //
9 // Distributed under the Boost Software License, Version 1.0. (See
10 // accompanying file LICENSE_1_0.txt or copy at
11 // http://www.boost.org/LICENSE_1_0.txt)
12 //
13
14 #include <pthread.h>
15
16 //
17 //  The generic pthread_mutex-based implementation sometimes leads to
18 //    inefficiencies. Example: a class with two atomic_count members
19 //    can get away with a single mutex.
20 //
21 //  Users can detect this situation by checking DYN_DETAIL_BOOST_AC_USE_PTHREADS.
22 //
23 namespace dyn_detail
24 {
25   
26 namespace boost
27 {
28
29 namespace detail
30 {
31
32 class atomic_count
33 {
34 private:
35
36     class scoped_lock
37     {
38     public:
39
40         scoped_lock(pthread_mutex_t & m): m_(m)
41         {
42             pthread_mutex_lock(&m_);
43         }
44
45         ~scoped_lock()
46         {
47             pthread_mutex_unlock(&m_);
48         }
49
50     private:
51
52         pthread_mutex_t & m_;
53     };
54
55 public:
56
57     explicit atomic_count(long v): value_(v)
58     {
59         pthread_mutex_init(&mutex_, 0);
60     }
61
62     ~atomic_count()
63     {
64         pthread_mutex_destroy(&mutex_);
65     }
66
67     void operator++()
68     {
69         scoped_lock lock(mutex_);
70         ++value_;
71     }
72
73     long operator--()
74     {
75         scoped_lock lock(mutex_);
76         return --value_;
77     }
78
79     operator long() const
80     {
81         scoped_lock lock(mutex_);
82         return value_;
83     }
84
85 private:
86
87     atomic_count(atomic_count const &);
88     atomic_count & operator=(atomic_count const &);
89
90     mutable pthread_mutex_t mutex_;
91     long value_;
92 };
93
94 } // namespace detail
95
96 } // namespace boost
97
98 } // namespace dyn_detail
99 #endif // #ifndef DYN_DETAIL_BOOST_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED