]> AND Private Git Repository - canny.git/blob - stc/exp/ml_stc_linux_make_v1.0/include/boost/smart_ptr/detail/atomic_count_pthreads.hpp
Logo AND Algorithmique Numérique Distribuée

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