mirror of
https://github.com/vdemydiuk/mtapi.git
synced 2026-08-06 15:37:52 +00:00
Added thirdparty: boost library
This commit is contained in:
+146
@@ -0,0 +1,146 @@
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// (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/sync/cv_status.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 winapi_condition
|
||||
{
|
||||
winapi_condition(const winapi_condition &);
|
||||
winapi_condition &operator=(const winapi_condition &);
|
||||
|
||||
public:
|
||||
winapi_condition()
|
||||
: m_condition_data()
|
||||
{}
|
||||
|
||||
~winapi_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>
|
||||
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); }
|
||||
|
||||
|
||||
template <typename L, typename TimePoint>
|
||||
bool timed_wait(L& lock, const TimePoint &abs_time)
|
||||
{ return m_condition_data.timed_wait(lock, abs_time); }
|
||||
|
||||
template <typename L, typename TimePoint, typename Pr>
|
||||
bool timed_wait(L& lock, const TimePoint &abs_time, Pr pred)
|
||||
{ return m_condition_data.timed_wait(lock, abs_time, pred); }
|
||||
|
||||
template <typename L, class TimePoint>
|
||||
cv_status wait_until(L& lock, const TimePoint &abs_time)
|
||||
{ return this->timed_wait(lock, abs_time) ? cv_status::no_timeout : cv_status::timeout; }
|
||||
|
||||
template <typename L, class TimePoint, typename Pr>
|
||||
bool wait_until(L& lock, const TimePoint &abs_time, Pr pred)
|
||||
{ return this->timed_wait(lock, abs_time, pred); }
|
||||
|
||||
template <typename L, class Duration>
|
||||
cv_status wait_for(L& lock, const Duration &dur)
|
||||
{ return this->wait_until(lock, duration_to_ustime(dur)); }
|
||||
|
||||
template <typename L, class Duration, typename Pr>
|
||||
bool wait_for(L& lock, const Duration &dur, Pr pred)
|
||||
{ return this->wait_until(lock, duration_to_ustime(dur), pred); }
|
||||
|
||||
private:
|
||||
|
||||
struct condition_data
|
||||
{
|
||||
typedef unsigned int integer_type;
|
||||
typedef winapi_semaphore semaphore_type;
|
||||
typedef winapi_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; }
|
||||
|
||||
integer_type m_nwaiters_blocked;
|
||||
integer_type m_nwaiters_gone;
|
||||
integer_type m_nwaiters_to_unblock;
|
||||
semaphore_type m_sem_block_queue;
|
||||
semaphore_type m_sem_block_lock;
|
||||
mutex_type 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
|
||||
Reference in New Issue
Block a user