1 #ifndef BOOST_PTHREAD_MUTEX_SCOPED_LOCK_HPP 2 #define BOOST_PTHREAD_MUTEX_SCOPED_LOCK_HPP 3 // (C) Copyright 2007-8 Anthony Williams 4 // 5 // Distributed under the Boost Software License, Version 1.0. (See 6 // accompanying file LICENSE_1_0.txt or copy at 7 // http://www.boost.org/LICENSE_1_0.txt) 8 9 #include <pthread.h> 10 #include <boost/assert.hpp> 11 12 #include <boost/config/abi_prefix.hpp> 13 14 namespace boost 15 { 16 namespace posix { 17 #ifdef BOOST_THREAD_HAS_EINTR_BUG 18 BOOST_FORCEINLINE BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS pthread_mutex_destroy(pthread_mutex_t * m)19 int pthread_mutex_destroy(pthread_mutex_t* m) 20 { 21 int ret; 22 do 23 { 24 ret = ::pthread_mutex_destroy(m); 25 } while (ret == EINTR); 26 return ret; 27 } 28 BOOST_FORCEINLINE BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS pthread_mutex_lock(pthread_mutex_t * m)29 int pthread_mutex_lock(pthread_mutex_t* m) 30 { 31 int ret; 32 do 33 { 34 ret = ::pthread_mutex_lock(m); 35 } while (ret == EINTR); 36 return ret; 37 } 38 BOOST_FORCEINLINE BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS pthread_mutex_unlock(pthread_mutex_t * m)39 int pthread_mutex_unlock(pthread_mutex_t* m) 40 { 41 int ret; 42 do 43 { 44 ret = ::pthread_mutex_unlock(m); 45 } while (ret == EINTR); 46 return ret; 47 } 48 #else 49 BOOST_FORCEINLINE BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS 50 int pthread_mutex_destroy(pthread_mutex_t* m) 51 { 52 return ::pthread_mutex_destroy(m); 53 } 54 BOOST_FORCEINLINE BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS 55 int pthread_mutex_lock(pthread_mutex_t* m) 56 { 57 return ::pthread_mutex_lock(m); 58 } 59 BOOST_FORCEINLINE BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS 60 int pthread_mutex_unlock(pthread_mutex_t* m) 61 { 62 return ::pthread_mutex_unlock(m); 63 } 64 65 #endif 66 BOOST_FORCEINLINE BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS pthread_mutex_trylock(pthread_mutex_t * m)67 int pthread_mutex_trylock(pthread_mutex_t* m) 68 { 69 return ::pthread_mutex_trylock(m); 70 } 71 72 BOOST_FORCEINLINE BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS pthread_cond_wait(pthread_cond_t * cond,pthread_mutex_t * mutex)73 int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) 74 { 75 return ::pthread_cond_wait(cond, mutex); 76 } 77 BOOST_FORCEINLINE BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS pthread_cond_signal(pthread_cond_t * cond)78 int pthread_cond_signal(pthread_cond_t *cond) 79 { 80 return ::pthread_cond_signal(cond); 81 } 82 83 84 } 85 namespace pthread 86 { 87 class pthread_mutex_scoped_lock 88 { 89 pthread_mutex_t* m; 90 bool locked; 91 public: pthread_mutex_scoped_lock(pthread_mutex_t * m_)92 explicit pthread_mutex_scoped_lock(pthread_mutex_t* m_) BOOST_NOEXCEPT: 93 m(m_),locked(true) 94 { 95 BOOST_VERIFY(!posix::pthread_mutex_lock(m)); 96 } unlock()97 void unlock() BOOST_NOEXCEPT 98 { 99 BOOST_VERIFY(!posix::pthread_mutex_unlock(m)); 100 locked=false; 101 } unlock_if_locked()102 void unlock_if_locked() BOOST_NOEXCEPT 103 { 104 if(locked) 105 { 106 unlock(); 107 } 108 } ~pthread_mutex_scoped_lock()109 ~pthread_mutex_scoped_lock() BOOST_NOEXCEPT 110 { 111 if(locked) 112 { 113 unlock(); 114 } 115 } 116 117 }; 118 119 class pthread_mutex_scoped_unlock 120 { 121 pthread_mutex_t* m; 122 public: pthread_mutex_scoped_unlock(pthread_mutex_t * m_)123 explicit pthread_mutex_scoped_unlock(pthread_mutex_t* m_) BOOST_NOEXCEPT: 124 m(m_) 125 { 126 BOOST_VERIFY(!posix::pthread_mutex_unlock(m)); 127 } ~pthread_mutex_scoped_unlock()128 ~pthread_mutex_scoped_unlock() BOOST_NOEXCEPT 129 { 130 BOOST_VERIFY(!posix::pthread_mutex_lock(m)); 131 } 132 133 }; 134 } 135 } 136 137 #include <boost/config/abi_suffix.hpp> 138 139 #endif 140