////////////////////////////////////////////////////////////////////////////// // // (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 #endif # #if defined(BOOST_HAS_PRAGMA_ONCE) # pragma once #endif #include #include #include #include #include #include #include #include #include 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 bool timed_wait(L& lock, const boost::posix_time::ptime &abs_time) { return m_condition_data.timed_wait(lock, abs_time); } template 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 void wait(L& lock) { m_condition_data.wait(lock); } template 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 m_condition_data; }; } //namespace ipcdetail } //namespace interprocess } //namespace boost #include #endif //BOOST_INTERPROCESS_DETAIL_WINDOWS_CONDITION_HPP