102 lines
2.3 KiB
C++
102 lines
2.3 KiB
C++
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// (C) Copyright Ion Gaztanaga 2012-2012. 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)
|
|
//
|
|
// See http://www.boost.org/libs/interprocess for documentation.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef BOOST_INTERPROCESS_DETAIL_LOCKS_HPP
|
|
#define BOOST_INTERPROCESS_DETAIL_LOCKS_HPP
|
|
|
|
#ifndef BOOST_CONFIG_HPP
|
|
# include <boost/config.hpp>
|
|
#endif
|
|
#
|
|
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
|
# pragma once
|
|
#endif
|
|
|
|
#include <boost/interprocess/detail/config_begin.hpp>
|
|
#include <boost/interprocess/detail/workaround.hpp>
|
|
|
|
namespace boost {
|
|
namespace interprocess {
|
|
namespace ipcdetail {
|
|
|
|
template<class Lock>
|
|
class internal_mutex_lock
|
|
{
|
|
typedef void (internal_mutex_lock::*unspecified_bool_type)();
|
|
public:
|
|
|
|
typedef typename Lock::mutex_type::internal_mutex_type mutex_type;
|
|
|
|
|
|
internal_mutex_lock(Lock &l)
|
|
: l_(l)
|
|
{}
|
|
|
|
mutex_type* mutex() const
|
|
{ return l_ ? &l_.mutex()->internal_mutex() : 0; }
|
|
|
|
void lock() { l_.lock(); }
|
|
|
|
void unlock() { l_.unlock(); }
|
|
|
|
operator unspecified_bool_type() const
|
|
{ return l_ ? &internal_mutex_lock::lock : 0; }
|
|
|
|
private:
|
|
Lock &l_;
|
|
};
|
|
|
|
template <class Lock>
|
|
class lock_inverter
|
|
{
|
|
Lock &l_;
|
|
public:
|
|
lock_inverter(Lock &l)
|
|
: l_(l)
|
|
{}
|
|
void lock() { l_.unlock(); }
|
|
void unlock() { l_.lock(); }
|
|
};
|
|
|
|
template <class Lock>
|
|
class lock_to_sharable
|
|
{
|
|
Lock &l_;
|
|
|
|
public:
|
|
explicit lock_to_sharable(Lock &l)
|
|
: l_(l)
|
|
{}
|
|
void lock() { l_.lock_sharable(); }
|
|
bool try_lock(){ return l_.try_lock_sharable(); }
|
|
void unlock() { l_.unlock_sharable(); }
|
|
};
|
|
|
|
template <class Lock>
|
|
class lock_to_wait
|
|
{
|
|
Lock &l_;
|
|
|
|
public:
|
|
explicit lock_to_wait(Lock &l)
|
|
: l_(l)
|
|
{}
|
|
void lock() { l_.wait(); }
|
|
bool try_lock(){ return l_.try_wait(); }
|
|
};
|
|
|
|
} //namespace ipcdetail
|
|
} //namespace interprocess
|
|
} //namespace boost
|
|
|
|
#include <boost/interprocess/detail/config_end.hpp>
|
|
|
|
#endif //BOOST_INTERPROCESS_DETAIL_LOCKS_HPP
|