| #ifndef NDNBOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED |
| #define NDNBOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED |
| |
| // |
| // ndnboost/detail/atomic_count_pthreads.hpp |
| // |
| // Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd. |
| // |
| // Distributed under the Boost Software License, Version 1.0. (See |
| // accompanying file LICENSE_1_0.txt or copy at |
| // http://www.boost.org/LICENSE_1_0.txt) |
| // |
| |
| #include <pthread.h> |
| |
| // |
| // The generic pthread_mutex-based implementation sometimes leads to |
| // inefficiencies. Example: a class with two atomic_count members |
| // can get away with a single mutex. |
| // |
| // Users can detect this situation by checking NDNBOOST_AC_USE_PTHREADS. |
| // |
| |
| namespace ndnboost |
| { |
| |
| namespace detail |
| { |
| |
| class atomic_count |
| { |
| private: |
| |
| class scoped_lock |
| { |
| public: |
| |
| scoped_lock(pthread_mutex_t & m): m_(m) |
| { |
| pthread_mutex_lock(&m_); |
| } |
| |
| ~scoped_lock() |
| { |
| pthread_mutex_unlock(&m_); |
| } |
| |
| private: |
| |
| pthread_mutex_t & m_; |
| }; |
| |
| public: |
| |
| explicit atomic_count(long v): value_(v) |
| { |
| pthread_mutex_init(&mutex_, 0); |
| } |
| |
| ~atomic_count() |
| { |
| pthread_mutex_destroy(&mutex_); |
| } |
| |
| long operator++() |
| { |
| scoped_lock lock(mutex_); |
| return ++value_; |
| } |
| |
| long operator--() |
| { |
| scoped_lock lock(mutex_); |
| return --value_; |
| } |
| |
| operator long() const |
| { |
| scoped_lock lock(mutex_); |
| return value_; |
| } |
| |
| private: |
| |
| atomic_count(atomic_count const &); |
| atomic_count & operator=(atomic_count const &); |
| |
| mutable pthread_mutex_t mutex_; |
| long value_; |
| }; |
| |
| } // namespace detail |
| |
| } // namespace ndnboost |
| |
| #endif // #ifndef NDNBOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED |