blob: 74ec16caecc3ab3041b1a07f370708273cf80cc7 [file] [log] [blame]
//////////////////////////////////////////////////////////////////////////////
//
// (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