130 lines
3.8 KiB
C++
130 lines
3.8 KiB
C++
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// (C) Copyright Ion Gaztanaga 2005-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_WINDOWS_CONDITION_HPP
|
|
#define BOOST_INTERPROCESS_DETAIL_WINDOWS_CONDITION_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>
|
|
#include <boost/interprocess/detail/posix_time_types_wrk.hpp>
|
|
|
|
#include <boost/interprocess/sync/interprocess_mutex.hpp>
|
|
#include <boost/interprocess/sync/scoped_lock.hpp>
|
|
#include <boost/interprocess/exceptions.hpp>
|
|
#include <boost/interprocess/sync/windows/semaphore.hpp>
|
|
#include <boost/interprocess/sync/windows/mutex.hpp>
|
|
#include <boost/interprocess/sync/detail/condition_algorithm_8a.hpp>
|
|
|
|
|
|
namespace boost {
|
|
namespace interprocess {
|
|
namespace ipcdetail {
|
|
|
|
class windows_condition
|
|
{
|
|
windows_condition(const windows_condition &);
|
|
windows_condition &operator=(const windows_condition &);
|
|
|
|
public:
|
|
windows_condition()
|
|
: m_condition_data()
|
|
{}
|
|
|
|
~windows_condition()
|
|
{
|
|
//Notify all waiting threads
|
|
//to allow POSIX semantics on condition destruction
|
|
this->notify_all();
|
|
}
|
|
|
|
void notify_one()
|
|
{ m_condition_data.notify_one(); }
|
|
|
|
void notify_all()
|
|
{ m_condition_data.notify_all(); }
|
|
|
|
template <typename L>
|
|
bool timed_wait(L& lock, const boost::posix_time::ptime &abs_time)
|
|
{ return m_condition_data.timed_wait(lock, abs_time); }
|
|
|
|
template <typename L, typename Pr>
|
|
bool timed_wait(L& lock, const boost::posix_time::ptime &abs_time, Pr pred)
|
|
{ return m_condition_data.timed_wait(lock, abs_time, pred); }
|
|
|
|
template <typename L>
|
|
void wait(L& lock)
|
|
{ m_condition_data.wait(lock); }
|
|
|
|
template <typename L, typename Pr>
|
|
void wait(L& lock, Pr pred)
|
|
{ m_condition_data.wait(lock, pred); }
|
|
|
|
private:
|
|
|
|
struct condition_data
|
|
{
|
|
typedef boost::int32_t integer_type;
|
|
typedef windows_semaphore semaphore_type;
|
|
typedef windows_mutex mutex_type;
|
|
|
|
condition_data()
|
|
: m_nwaiters_blocked(0)
|
|
, m_nwaiters_gone(0)
|
|
, m_nwaiters_to_unblock(0)
|
|
, m_sem_block_queue(0)
|
|
, m_sem_block_lock(1)
|
|
, m_mtx_unblock_lock()
|
|
{}
|
|
|
|
integer_type &get_nwaiters_blocked()
|
|
{ return m_nwaiters_blocked; }
|
|
|
|
integer_type &get_nwaiters_gone()
|
|
{ return m_nwaiters_gone; }
|
|
|
|
integer_type &get_nwaiters_to_unblock()
|
|
{ return m_nwaiters_to_unblock; }
|
|
|
|
semaphore_type &get_sem_block_queue()
|
|
{ return m_sem_block_queue; }
|
|
|
|
semaphore_type &get_sem_block_lock()
|
|
{ return m_sem_block_lock; }
|
|
|
|
mutex_type &get_mtx_unblock_lock()
|
|
{ return m_mtx_unblock_lock; }
|
|
|
|
boost::int32_t m_nwaiters_blocked;
|
|
boost::int32_t m_nwaiters_gone;
|
|
boost::int32_t m_nwaiters_to_unblock;
|
|
windows_semaphore m_sem_block_queue;
|
|
windows_semaphore m_sem_block_lock;
|
|
windows_mutex m_mtx_unblock_lock;
|
|
};
|
|
|
|
ipcdetail::condition_8a_wrapper<condition_data> m_condition_data;
|
|
};
|
|
|
|
} //namespace ipcdetail
|
|
} //namespace interprocess
|
|
} //namespace boost
|
|
|
|
#include <boost/interprocess/detail/config_end.hpp>
|
|
|
|
#endif //BOOST_INTERPROCESS_DETAIL_WINDOWS_CONDITION_HPP
|