////////////////////////////////////////////////////////////////////////////// // // (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 #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