1 #ifndef BOOST_SMART_PTR_DETAIL_LWM_PTHREADS_HPP_INCLUDED 2 #define BOOST_SMART_PTR_DETAIL_LWM_PTHREADS_HPP_INCLUDED 3 4 // MS compatible compilers support #pragma once 5 6 #if defined(_MSC_VER) && (_MSC_VER >= 1020) 7 # pragma once 8 #endif 9 10 // 11 // boost/detail/lwm_pthreads.hpp 12 // 13 // Copyright (c) 2002 Peter Dimov and Multi Media Ltd. 14 // 15 // Distributed under the Boost Software License, Version 1.0. (See 16 // accompanying file LICENSE_1_0.txt or copy at 17 // http://www.boost.org/LICENSE_1_0.txt) 18 // 19 20 #include <boost/assert.hpp> 21 #include <pthread.h> 22 23 namespace boost 24 { 25 26 namespace detail 27 { 28 29 class lightweight_mutex 30 { 31 private: 32 33 pthread_mutex_t m_; 34 35 lightweight_mutex(lightweight_mutex const &); 36 lightweight_mutex & operator=(lightweight_mutex const &); 37 38 public: 39 lightweight_mutex()40 lightweight_mutex() 41 { 42 43 // HPUX 10.20 / DCE has a nonstandard pthread_mutex_init 44 45 #if defined(__hpux) && defined(_DECTHREADS_) 46 BOOST_VERIFY( pthread_mutex_init( &m_, pthread_mutexattr_default ) == 0 ); 47 #else 48 BOOST_VERIFY( pthread_mutex_init( &m_, 0 ) == 0 ); 49 #endif 50 } 51 ~lightweight_mutex()52 ~lightweight_mutex() 53 { 54 BOOST_VERIFY( pthread_mutex_destroy( &m_ ) == 0 ); 55 } 56 57 class scoped_lock; 58 friend class scoped_lock; 59 60 class scoped_lock 61 { 62 private: 63 64 pthread_mutex_t & m_; 65 66 scoped_lock(scoped_lock const &); 67 scoped_lock & operator=(scoped_lock const &); 68 69 public: 70 scoped_lock(lightweight_mutex & m)71 scoped_lock(lightweight_mutex & m): m_(m.m_) 72 { 73 BOOST_VERIFY( pthread_mutex_lock( &m_ ) == 0 ); 74 } 75 ~scoped_lock()76 ~scoped_lock() 77 { 78 BOOST_VERIFY( pthread_mutex_unlock( &m_ ) == 0 ); 79 } 80 }; 81 }; 82 83 } // namespace detail 84 85 } // namespace boost 86 87 #endif // #ifndef BOOST_SMART_PTR_DETAIL_LWM_PTHREADS_HPP_INCLUDED 88