00001 #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED
00002 #define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include <pthread.h>
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 namespace boost
00025 {
00026
00027 namespace detail
00028 {
00029
00030 class atomic_count
00031 {
00032 private:
00033
00034 class scoped_lock
00035 {
00036 public:
00037
00038 scoped_lock(pthread_mutex_t & m): m_(m)
00039 {
00040 pthread_mutex_lock(&m_);
00041 }
00042
00043 ~scoped_lock()
00044 {
00045 pthread_mutex_unlock(&m_);
00046 }
00047
00048 private:
00049
00050 pthread_mutex_t & m_;
00051 };
00052
00053 public:
00054
00055 explicit atomic_count(long v): value_(v)
00056 {
00057 pthread_mutex_init(&mutex_, 0);
00058 }
00059
00060 ~atomic_count()
00061 {
00062 pthread_mutex_destroy(&mutex_);
00063 }
00064
00065 long operator++()
00066 {
00067 scoped_lock lock(mutex_);
00068 return ++value_;
00069 }
00070
00071 long operator--()
00072 {
00073 scoped_lock lock(mutex_);
00074 return --value_;
00075 }
00076
00077 operator long() const
00078 {
00079 scoped_lock lock(mutex_);
00080 return value_;
00081 }
00082
00083 private:
00084
00085 atomic_count(atomic_count const &);
00086 atomic_count & operator=(atomic_count const &);
00087
00088 mutable pthread_mutex_t mutex_;
00089 long value_;
00090 };
00091
00092 }
00093
00094 }
00095
00096 #endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED