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