/Src/Dependencies/Boost/boost/interprocess/sync/emulation/interprocess_semaphore.hpp
http://hadesmem.googlecode.com/ · C++ Header · 75 lines · 47 code · 12 blank · 16 comment · 8 complexity · dfe966da121e7b16599d58ef9f0693cf MD5 · raw file
- //////////////////////////////////////////////////////////////////////////////
- //
- // (C) Copyright Ion Gaztanaga 2005-2009. 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.
- //
- //////////////////////////////////////////////////////////////////////////////
- #include<boost/interprocess/exceptions.hpp>
- #include <boost/interprocess/detail/posix_time_types_wrk.hpp>
- namespace boost {
- namespace interprocess {
- inline interprocess_semaphore::~interprocess_semaphore()
- {}
- inline interprocess_semaphore::interprocess_semaphore(unsigned int initialCount)
- { detail::atomic_write32(&this->m_count, boost::uint32_t(initialCount)); }
- inline void interprocess_semaphore::post()
- {
- detail::atomic_inc32(&m_count);
- }
- inline void interprocess_semaphore::wait()
- {
- while(!detail::atomic_add_unless32(&m_count, boost::uint32_t(-1), boost::uint32_t(0))){
- while(detail::atomic_read32(&m_count) == 0){
- detail::thread_yield();
- }
- }
- }
- inline bool interprocess_semaphore::try_wait()
- {
- return detail::atomic_add_unless32(&m_count, boost::uint32_t(-1), boost::uint32_t(0));
- }
- inline bool interprocess_semaphore::timed_wait(const boost::posix_time::ptime &abs_time)
- {
- if(abs_time == boost::posix_time::pos_infin){
- this->wait();
- return true;
- }
- //Obtain current count and target time
- boost::posix_time::ptime now(microsec_clock::universal_time());
- if(now >= abs_time)
- return false;
- do{
- if(this->try_wait()){
- break;
- }
- now = microsec_clock::universal_time();
- if(now >= abs_time){
- return this->try_wait();
- }
- // relinquish current time slice
- detail::thread_yield();
- }while (true);
- return true;
- }
- /*
- inline int interprocess_semaphore::get_count() const
- {
- return (int)detail::atomic_read32(&m_count);
- }*/
- } //namespace interprocess {
- } //namespace boost {