diff options
Diffstat (limited to '3party/boost/boost/interprocess/sync/interprocess_condition.hpp')
-rw-r--r-- | 3party/boost/boost/interprocess/sync/interprocess_condition.hpp | 89 |
1 files changed, 41 insertions, 48 deletions
diff --git a/3party/boost/boost/interprocess/sync/interprocess_condition.hpp b/3party/boost/boost/interprocess/sync/interprocess_condition.hpp index 5e909a94e7..9d0bea640e 100644 --- a/3party/boost/boost/interprocess/sync/interprocess_condition.hpp +++ b/3party/boost/boost/interprocess/sync/interprocess_condition.hpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // -// (C) Copyright Ion Gaztanaga 2005-2009. Distributed under the Boost +// (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) // @@ -21,22 +21,20 @@ #include <boost/interprocess/detail/workaround.hpp> #include <boost/interprocess/detail/posix_time_types_wrk.hpp> -#include <boost/interprocess/sync/scoped_lock.hpp> -#include <boost/interprocess/sync/interprocess_condition.hpp> #include <boost/interprocess/sync/interprocess_mutex.hpp> #include <boost/interprocess/exceptions.hpp> #include <boost/limits.hpp> #include <boost/assert.hpp> #if !defined(BOOST_INTERPROCESS_FORCE_GENERIC_EMULATION) && defined(BOOST_INTERPROCESS_POSIX_PROCESS_SHARED) - #include <pthread.h> - #include <errno.h> - #include <boost/interprocess/sync/posix/pthread_helpers.hpp> + #include <boost/interprocess/sync/posix/condition.hpp> #define BOOST_INTERPROCESS_USE_POSIX -#else - #include <boost/interprocess/detail/atomic.hpp> - #include <boost/cstdint.hpp> - #include <boost/interprocess/detail/os_thread_functions.hpp> +//Experimental... +#elif !defined(BOOST_INTERPROCESS_FORCE_GENERIC_EMULATION) && defined (BOOST_INTERPROCESS_WINDOWS) + #include <boost/interprocess/sync/windows/condition.hpp> + #define BOOST_INTERPROCESS_USE_WINDOWS +#elif !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + #include <boost/interprocess/sync/spin/condition.hpp> #define BOOST_INTERPROCESS_USE_GENERIC_EMULATION #endif @@ -66,29 +64,31 @@ class interprocess_condition /// @endcond public: //!Constructs a interprocess_condition. On error throws interprocess_exception. - interprocess_condition(); + interprocess_condition(){} //!Destroys *this //!liberating system resources. - ~interprocess_condition(); + ~interprocess_condition(){} - //!If there is a thread waiting on *this, change that + //!If there is a thread waiting on *this, change that //!thread's state to ready. Otherwise there is no effect. - void notify_one(); + 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(); + 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 + //!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 <typename L> void wait(L& lock) { if (!lock) throw lock_exception(); - do_wait(*lock.mutex()); + this->do_wait(*lock.mutex()); } //!The same as: @@ -100,12 +100,12 @@ class interprocess_condition throw lock_exception(); while (!pred()) - do_wait(*lock.mutex()); + 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, + //!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 <typename L> @@ -117,11 +117,11 @@ class interprocess_condition } if (!lock) throw lock_exception(); - return do_timed_wait(abs_time, *lock.mutex()); + return this->do_timed_wait(abs_time, *lock.mutex()); } - //!The same as: while (!pred()) { - //! if (!timed_wait(lock, abs_time)) return pred(); + //!The same as: while (!pred()) { + //! if (!timed_wait(lock, abs_time)) return pred(); //! } return true; template <typename L, typename Pr> bool timed_wait(L& lock, const boost::posix_time::ptime &abs_time, Pr pred) @@ -133,7 +133,7 @@ class interprocess_condition if (!lock) throw lock_exception(); while (!pred()){ - if (!do_timed_wait(abs_time, *lock.mutex())) + if (!this->do_timed_wait(abs_time, *lock.mutex())) return pred(); } @@ -141,39 +141,32 @@ class interprocess_condition } /// @cond - private: - void do_wait(interprocess_mutex &mut); - bool do_timed_wait(const boost::posix_time::ptime &abs_time, interprocess_mutex &mut); + 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) - enum { SLEEP = 0, NOTIFY_ONE, NOTIFY_ALL }; - interprocess_mutex m_enter_mut; - //interprocess_mutex m_check_mut; - volatile boost::uint32_t m_command; - volatile boost::uint32_t m_num_waiters; - bool do_timed_wait(bool tout_enabled, const boost::posix_time::ptime &abs_time, interprocess_mutex &mut); - void notify(boost::uint32_t command); + #undef BOOST_INTERPROCESS_USE_GENERIC_EMULATION + ipcdetail::spin_condition m_condition; #elif defined(BOOST_INTERPROCESS_USE_POSIX) - pthread_cond_t m_condition; + #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 -#ifdef BOOST_INTERPROCESS_USE_GENERIC_EMULATION -# undef BOOST_INTERPROCESS_USE_GENERIC_EMULATION -# include <boost/interprocess/sync/emulation/interprocess_condition.hpp> -#endif - -#ifdef BOOST_INTERPROCESS_USE_POSIX -# undef BOOST_INTERPROCESS_USE_POSIX -# include <boost/interprocess/sync/posix/interprocess_condition.hpp> -#endif - #include <boost/interprocess/detail/config_end.hpp> #endif // BOOST_INTERPROCESS_CONDITION_HPP |