1 #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED 2 #define BOOST_SMART_PTR_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 <boost/assert.hpp> 15 #include <pthread.h> 16 17 // 18 // The generic pthread_mutex-based implementation sometimes leads to 19 // inefficiencies. Example: a class with two atomic_count members 20 // can get away with a single mutex. 21 // 22 // Users can detect this situation by checking BOOST_AC_USE_PTHREADS. 23 // 24 25 namespace boost 26 { 27 28 namespace detail 29 { 30 31 class atomic_count 32 { 33 private: 34 35 class scoped_lock 36 { 37 public: 38 scoped_lock(pthread_mutex_t & m)39 scoped_lock(pthread_mutex_t & m): m_(m) 40 { 41 BOOST_VERIFY( pthread_mutex_lock( &m_ ) == 0 ); 42 } 43 ~scoped_lock()44 ~scoped_lock() 45 { 46 BOOST_VERIFY( pthread_mutex_unlock( &m_ ) == 0 ); 47 } 48 49 private: 50 51 pthread_mutex_t & m_; 52 }; 53 54 public: 55 atomic_count(long v)56 explicit atomic_count(long v): value_(v) 57 { 58 BOOST_VERIFY( pthread_mutex_init( &mutex_, 0 ) == 0 ); 59 } 60 ~atomic_count()61 ~atomic_count() 62 { 63 BOOST_VERIFY( pthread_mutex_destroy( &mutex_ ) == 0 ); 64 } 65 operator ++()66 long operator++() 67 { 68 scoped_lock lock(mutex_); 69 return ++value_; 70 } 71 operator --()72 long operator--() 73 { 74 scoped_lock lock(mutex_); 75 return --value_; 76 } 77 operator long() const78 operator long() const 79 { 80 scoped_lock lock(mutex_); 81 return value_; 82 } 83 84 private: 85 86 atomic_count(atomic_count const &); 87 atomic_count & operator=(atomic_count const &); 88 89 mutable pthread_mutex_t mutex_; 90 long value_; 91 }; 92 93 } // namespace detail 94 95 } // namespace boost 96 97 #endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED 98