////////////////////////////////////////////////////////////////////////////// | |
// | |
// (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. | |
// | |
////////////////////////////////////////////////////////////////////////////// | |
#ifndef BOOST_INTERPROCESS_SEMAPHORE_HPP | |
#define BOOST_INTERPROCESS_SEMAPHORE_HPP | |
/// @cond | |
#if (defined _MSC_VER) && (_MSC_VER >= 1200) | |
# pragma once | |
#endif | |
#include <boost/interprocess/detail/config_begin.hpp> | |
#include <boost/interprocess/detail/workaround.hpp> | |
#include <boost/interprocess/creation_tags.hpp> | |
#include <boost/interprocess/exceptions.hpp> | |
#include <boost/interprocess/detail/posix_time_types_wrk.hpp> | |
#if !defined(BOOST_INTERPROCESS_FORCE_GENERIC_EMULATION) && \ | |
(defined(BOOST_INTERPROCESS_POSIX_PROCESS_SHARED) && defined(BOOST_INTERPROCESS_POSIX_NAMED_SEMAPHORES)) | |
#include <fcntl.h> //O_CREAT, O_*... | |
#include <unistd.h> //close | |
#include <string> //std::string | |
#include <semaphore.h> //sem_* family, SEM_VALUE_MAX | |
#include <sys/stat.h> //mode_t, S_IRWXG, S_IRWXO, S_IRWXU, | |
#include <boost/interprocess/sync/posix/semaphore_wrapper.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> | |
#define BOOST_INTERPROCESS_USE_GENERIC_EMULATION | |
#endif | |
/// @endcond | |
//!\file | |
//!Describes a interprocess_semaphore class for inter-process synchronization | |
namespace boost { | |
namespace interprocess { | |
//!Wraps a interprocess_semaphore that can be placed in shared memory and can be | |
//!shared between processes. Allows timed lock tries | |
class interprocess_semaphore | |
{ | |
/// @cond | |
//Non-copyable | |
interprocess_semaphore(const interprocess_semaphore &); | |
interprocess_semaphore &operator=(const interprocess_semaphore &); | |
/// @endcond | |
public: | |
//!Creates a interprocess_semaphore with the given initial count. | |
//!interprocess_exception if there is an error.*/ | |
interprocess_semaphore(unsigned int initialCount); | |
//!Destroys the interprocess_semaphore. | |
//!Does not throw | |
~interprocess_semaphore(); | |
//!Increments the interprocess_semaphore count. If there are processes/threads blocked waiting | |
//!for the interprocess_semaphore, then one of these processes will return successfully from | |
//!its wait function. If there is an error an interprocess_exception exception is thrown. | |
void post(); | |
//!Decrements the interprocess_semaphore. If the interprocess_semaphore value is not greater than zero, | |
//!then the calling process/thread blocks until it can decrement the counter. | |
//!If there is an error an interprocess_exception exception is thrown. | |
void wait(); | |
//!Decrements the interprocess_semaphore if the interprocess_semaphore's value is greater than zero | |
//!and returns true. If the value is not greater than zero returns false. | |
//!If there is an error an interprocess_exception exception is thrown. | |
bool try_wait(); | |
//!Decrements the interprocess_semaphore if the interprocess_semaphore's value is greater | |
//!than zero and returns true. Otherwise, waits for the interprocess_semaphore | |
//!to the posted or the timeout expires. If the timeout expires, the | |
//!function returns false. If the interprocess_semaphore is posted the function | |
//!returns true. If there is an error throws sem_exception | |
bool timed_wait(const boost::posix_time::ptime &abs_time); | |
//!Returns the interprocess_semaphore count | |
// int get_count() const; | |
/// @cond | |
private: | |
#if defined(BOOST_INTERPROCESS_USE_GENERIC_EMULATION) | |
volatile boost::uint32_t m_count; | |
#else | |
detail::semaphore_wrapper m_sem; | |
#endif //#if defined(BOOST_INTERPROCESS_USE_GENERIC_EMULATION) | |
/// @endcond | |
}; | |
} //namespace interprocess { | |
} //namespace boost { | |
#ifdef BOOST_INTERPROCESS_USE_GENERIC_EMULATION | |
# undef BOOST_INTERPROCESS_USE_GENERIC_EMULATION | |
# include <boost/interprocess/sync/emulation/interprocess_semaphore.hpp> | |
#endif | |
#ifdef BOOST_INTERPROCESS_USE_POSIX | |
# undef BOOST_INTERPROCESS_USE_POSIX | |
# include <boost/interprocess/sync/posix/interprocess_semaphore.hpp> | |
#endif | |
#include <boost/interprocess/detail/config_end.hpp> | |
#endif //BOOST_INTERPROCESS_SEMAPHORE_HPP |