| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 | // 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)// (C) Copyright 2012 Vicente J. Botet Escriba#ifndef BOOST_THREAD_REVERSE_LOCK_HPP#define BOOST_THREAD_REVERSE_LOCK_HPP#include <boost/thread/detail/config.hpp>#include <boost/thread/detail/move.hpp>#include <boost/thread/lockable_traits.hpp>#include <boost/thread/lock_options.hpp>#include <boost/thread/detail/delete.hpp>namespace boost{    template<typename Lock>    class reverse_lock    {    public:        typedef typename Lock::mutex_type mutex_type;        BOOST_THREAD_NO_COPYABLE(reverse_lock)        explicit reverse_lock(Lock& m_)        : m(m_), mtx(0)        {            if (m.owns_lock())            {              m.unlock();            }            mtx=m.release();        }        ~reverse_lock()        {          if (mtx) {            mtx->lock();            m = BOOST_THREAD_MAKE_RV_REF(Lock(*mtx, adopt_lock));          }        }    private:      Lock& m;      mutex_type* mtx;    };#ifdef BOOST_THREAD_NO_AUTO_DETECT_MUTEX_TYPES    template<typename T>    struct is_mutex_type<reverse_lock<T> >    {        BOOST_STATIC_CONSTANT(bool, value = true);    };#endif}#endif // header
 |