• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Distributed under the Boost Software License, Version 1.0. (See
2 // accompanying file LICENSE_1_0.txt or copy at
3 // http://www.boost.org/LICENSE_1_0.txt)
4 // (C) Copyright 2012 Vicente J. Botet Escriba
5 
6 #ifndef BOOST_THREAD_REVERSE_LOCK_HPP
7 #define BOOST_THREAD_REVERSE_LOCK_HPP
8 #include <boost/thread/detail/config.hpp>
9 #include <boost/thread/detail/move.hpp>
10 #include <boost/thread/lockable_traits.hpp>
11 #include <boost/thread/lock_options.hpp>
12 #include <boost/thread/detail/delete.hpp>
13 
14 namespace boost
15 {
16 
17     template<typename Lock>
18     class reverse_lock
19     {
20     public:
21         typedef typename Lock::mutex_type mutex_type;
22         BOOST_THREAD_NO_COPYABLE(reverse_lock)
23 
reverse_lock(Lock & m_)24         explicit reverse_lock(Lock& m_)
25         : m(m_), mtx(0)
26         {
27             if (m.owns_lock())
28             {
29               m.unlock();
30             }
31             mtx=m.release();
32         }
~reverse_lock()33         ~reverse_lock()
34         {
35           if (mtx) {
36             mtx->lock();
37             m = BOOST_THREAD_MAKE_RV_REF(Lock(*mtx, adopt_lock));
38           }
39         }
40 
41     private:
42       Lock& m;
43       mutex_type* mtx;
44     };
45 
46 
47 #ifdef BOOST_THREAD_NO_AUTO_DETECT_MUTEX_TYPES
48     template<typename T>
49     struct is_mutex_type<reverse_lock<T> >
50     {
51         BOOST_STATIC_CONSTANT(bool, value = true);
52     };
53 
54 #endif
55 
56 
57 }
58 
59 #endif // header
60