named_semaphore.hpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // (C) Copyright Ion Gaztanaga 2005-2012. Distributed under the Boost
  4. // Software License, Version 1.0. (See accompanying file
  5. // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. //
  7. // See http://www.boost.org/libs/interprocess for documentation.
  8. //
  9. //////////////////////////////////////////////////////////////////////////////
  10. #ifndef BOOST_INTERPROCESS_SHM_NAMED_SEMAPHORE_HPP
  11. #define BOOST_INTERPROCESS_SHM_NAMED_SEMAPHORE_HPP
  12. #if (defined _MSC_VER) && (_MSC_VER >= 1200)
  13. # pragma once
  14. #endif
  15. #include <boost/interprocess/detail/config_begin.hpp>
  16. #include <boost/interprocess/detail/workaround.hpp>
  17. #include <boost/interprocess/creation_tags.hpp>
  18. #include <boost/interprocess/exceptions.hpp>
  19. #include <boost/interprocess/permissions.hpp>
  20. #include <boost/interprocess/detail/interprocess_tester.hpp>
  21. #include <boost/interprocess/detail/posix_time_types_wrk.hpp>
  22. #include <boost/interprocess/shared_memory_object.hpp>
  23. #include <boost/interprocess/detail/managed_open_or_create_impl.hpp>
  24. #include <boost/interprocess/sync/interprocess_semaphore.hpp>
  25. #include <boost/interprocess/sync/shm/named_creation_functor.hpp>
  26. namespace boost {
  27. namespace interprocess {
  28. namespace ipcdetail {
  29. class shm_named_semaphore
  30. {
  31. /// @cond
  32. //Non-copyable
  33. shm_named_semaphore();
  34. shm_named_semaphore(const shm_named_semaphore &);
  35. shm_named_semaphore &operator=(const shm_named_semaphore &);
  36. /// @endcond
  37. public:
  38. shm_named_semaphore(create_only_t, const char *name, unsigned int initialCount, const permissions &perm = permissions());
  39. shm_named_semaphore(open_or_create_t, const char *name, unsigned int initialCount, const permissions &perm = permissions());
  40. shm_named_semaphore(open_only_t, const char *name);
  41. ~shm_named_semaphore();
  42. void post();
  43. void wait();
  44. bool try_wait();
  45. bool timed_wait(const boost::posix_time::ptime &abs_time);
  46. static bool remove(const char *name);
  47. /// @cond
  48. private:
  49. friend class interprocess_tester;
  50. void dont_close_on_destruction();
  51. interprocess_semaphore *semaphore() const
  52. { return static_cast<interprocess_semaphore*>(m_shmem.get_user_address()); }
  53. typedef ipcdetail::managed_open_or_create_impl<shared_memory_object, 0, true, false> open_create_impl_t;
  54. open_create_impl_t m_shmem;
  55. typedef named_creation_functor<interprocess_semaphore, int> construct_func_t;
  56. /// @endcond
  57. };
  58. inline shm_named_semaphore::~shm_named_semaphore()
  59. {}
  60. inline void shm_named_semaphore::dont_close_on_destruction()
  61. { interprocess_tester::dont_close_on_destruction(m_shmem); }
  62. inline shm_named_semaphore::shm_named_semaphore
  63. (create_only_t, const char *name, unsigned int initialCount, const permissions &perm)
  64. : m_shmem (create_only
  65. ,name
  66. ,sizeof(interprocess_semaphore) +
  67. open_create_impl_t::ManagedOpenOrCreateUserOffset
  68. ,read_write
  69. ,0
  70. ,construct_func_t(DoCreate, initialCount)
  71. ,perm)
  72. {}
  73. inline shm_named_semaphore::shm_named_semaphore
  74. (open_or_create_t, const char *name, unsigned int initialCount, const permissions &perm)
  75. : m_shmem (open_or_create
  76. ,name
  77. ,sizeof(interprocess_semaphore) +
  78. open_create_impl_t::ManagedOpenOrCreateUserOffset
  79. ,read_write
  80. ,0
  81. ,construct_func_t(DoOpenOrCreate, initialCount)
  82. ,perm)
  83. {}
  84. inline shm_named_semaphore::shm_named_semaphore
  85. (open_only_t, const char *name)
  86. : m_shmem (open_only
  87. ,name
  88. ,read_write
  89. ,0
  90. ,construct_func_t(DoOpen, 0))
  91. {}
  92. inline void shm_named_semaphore::post()
  93. { semaphore()->post(); }
  94. inline void shm_named_semaphore::wait()
  95. { semaphore()->wait(); }
  96. inline bool shm_named_semaphore::try_wait()
  97. { return semaphore()->try_wait(); }
  98. inline bool shm_named_semaphore::timed_wait(const boost::posix_time::ptime &abs_time)
  99. {
  100. if(abs_time == boost::posix_time::pos_infin){
  101. this->wait();
  102. return true;
  103. }
  104. return semaphore()->timed_wait(abs_time);
  105. }
  106. inline bool shm_named_semaphore::remove(const char *name)
  107. { return shared_memory_object::remove(name); }
  108. } //namespace ipcdetail {
  109. } //namespace interprocess {
  110. } //namespace boost {
  111. #include <boost/interprocess/detail/config_end.hpp>
  112. #endif //BOOST_INTERPROCESS_SHM_NAMED_SEMAPHORE_HPP