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