////////////////////////////////////////////////////////////////////////////// // // (C) Copyright Ion Gaztanaga 2005-2011. 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_CONDITION_HPP #define BOOST_INTERPROCESS_CONDITION_HPP #if (defined _MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif /// @cond #include #include #include #include #include #include #include #if !defined(BOOST_INTERPROCESS_FORCE_GENERIC_EMULATION) && defined(BOOST_INTERPROCESS_POSIX_PROCESS_SHARED) #include #define BOOST_INTERPROCESS_USE_POSIX //Experimental... #elif !defined(BOOST_INTERPROCESS_FORCE_GENERIC_EMULATION) && defined (BOOST_INTERPROCESS_WINDOWS) #include #define BOOST_INTERPROCESS_USE_WINDOWS #elif !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) #include #define BOOST_INTERPROCESS_USE_GENERIC_EMULATION #endif /// @endcond //!\file //!Describes process-shared variables interprocess_condition class namespace boost { namespace posix_time { class ptime; } namespace interprocess { class named_condition; //!This class is a condition variable that can be placed in shared memory or //!memory mapped files. class interprocess_condition { /// @cond //Non-copyable interprocess_condition(const interprocess_condition &); interprocess_condition &operator=(const interprocess_condition &); friend class named_condition; /// @endcond public: //!Constructs a interprocess_condition. On error throws interprocess_exception. interprocess_condition(){} //!Destroys *this //!liberating system resources. ~interprocess_condition(){} //!If there is a thread waiting on *this, change that //!thread's state to ready. Otherwise there is no effect. void notify_one() { m_condition.notify_one(); } //!Change the state of all threads waiting on *this to ready. //!If there are no waiting threads, notify_all() has no effect. void notify_all() { m_condition.notify_all(); } //!Releases the lock on the interprocess_mutex object associated with lock, blocks //!the current thread of execution until readied by a call to //!this->notify_one() or this->notify_all(), and then reacquires the lock. template void wait(L& lock) { if (!lock) throw lock_exception(); this->do_wait(*lock.mutex()); } //!The same as: //!while (!pred()) wait(lock) template void wait(L& lock, Pr pred) { if (!lock) throw lock_exception(); while (!pred()) this->do_wait(*lock.mutex()); } //!Releases the lock on the interprocess_mutex object associated with lock, blocks //!the current thread of execution until readied by a call to //!this->notify_one() or this->notify_all(), or until time abs_time is reached, //!and then reacquires the lock. //!Returns: false if time abs_time is reached, otherwise true. template bool timed_wait(L& lock, const boost::posix_time::ptime &abs_time) { if(abs_time == boost::posix_time::pos_infin){ this->wait(lock); return true; } if (!lock) throw lock_exception(); return this->do_timed_wait(abs_time, *lock.mutex()); } //!The same as: while (!pred()) { //! if (!timed_wait(lock, abs_time)) return pred(); //! } return true; template bool timed_wait(L& lock, const boost::posix_time::ptime &abs_time, Pr pred) { if(abs_time == boost::posix_time::pos_infin){ this->wait(lock, pred); return true; } if (!lock) throw lock_exception(); while (!pred()){ if (!this->do_timed_wait(abs_time, *lock.mutex())) return pred(); } return true; } /// @cond void do_wait(interprocess_mutex &mut) { m_condition.do_wait(mut.mutex); } bool do_timed_wait(const boost::posix_time::ptime &abs_time, interprocess_mutex &mut) { return m_condition.do_timed_wait(abs_time, mut.mutex); } private: #if defined (BOOST_INTERPROCESS_USE_GENERIC_EMULATION) #undef BOOST_INTERPROCESS_USE_GENERIC_EMULATION ipcdetail::spin_condition m_condition; #elif defined(BOOST_INTERPROCESS_USE_POSIX) #undef BOOST_INTERPROCESS_USE_POSIX ipcdetail::posix_condition m_condition; #elif defined(BOOST_INTERPROCESS_USE_WINDOWS) #undef BOOST_INTERPROCESS_USE_WINDOWS ipcdetail::windows_condition m_condition; #else #error "Unknown platform for interprocess_mutex" #endif /// @endcond }; } //namespace interprocess } // namespace boost #include #endif // BOOST_INTERPROCESS_CONDITION_HPP