You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
		
		
		
		
		
			
		
			
				
					
					
						
							96 lines
						
					
					
						
							1.7 KiB
						
					
					
				
			
		
		
	
	
							96 lines
						
					
					
						
							1.7 KiB
						
					
					
				#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED | 
						|
#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED | 
						|
 | 
						|
// | 
						|
//  boost/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 BOOST_AC_USE_PTHREADS. | 
						|
// | 
						|
 | 
						|
namespace boost | 
						|
{ | 
						|
 | 
						|
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 boost | 
						|
 | 
						|
#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED
 | 
						|
 |