named_semaphore.hpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // (C) Copyright Ion Gaztanaga 2011-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_WINDOWS_NAMED_SEMAPHORE_HPP
  11. #define BOOST_INTERPROCESS_WINDOWS_NAMED_SEMAPHORE_HPP
  12. #ifndef BOOST_CONFIG_HPP
  13. # include <boost/config.hpp>
  14. #endif
  15. #
  16. #if defined(BOOST_HAS_PRAGMA_ONCE)
  17. # pragma once
  18. #endif
  19. #include <boost/interprocess/detail/config_begin.hpp>
  20. #include <boost/interprocess/detail/workaround.hpp>
  21. #include <boost/interprocess/creation_tags.hpp>
  22. #include <boost/interprocess/permissions.hpp>
  23. #include <boost/interprocess/detail/interprocess_tester.hpp>
  24. #include <boost/interprocess/detail/posix_time_types_wrk.hpp>
  25. #include <boost/interprocess/sync/windows/named_sync.hpp>
  26. #include <boost/interprocess/sync/windows/winapi_semaphore_wrapper.hpp>
  27. namespace boost {
  28. namespace interprocess {
  29. namespace ipcdetail {
  30. class windows_named_semaphore
  31. {
  32. #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED)
  33. //Non-copyable
  34. windows_named_semaphore();
  35. windows_named_semaphore(const windows_named_semaphore &);
  36. windows_named_semaphore &operator=(const windows_named_semaphore &);
  37. #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED
  38. public:
  39. windows_named_semaphore(create_only_t, const char *name, unsigned int initialCount, const permissions &perm = permissions());
  40. windows_named_semaphore(open_or_create_t, const char *name, unsigned int initialCount, const permissions &perm = permissions());
  41. windows_named_semaphore(open_only_t, const char *name);
  42. ~windows_named_semaphore();
  43. void post();
  44. void wait();
  45. bool try_wait();
  46. bool timed_wait(const boost::posix_time::ptime &abs_time);
  47. static bool remove(const char *name);
  48. #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED)
  49. private:
  50. friend class interprocess_tester;
  51. void dont_close_on_destruction();
  52. winapi_semaphore_wrapper m_sem_wrapper;
  53. windows_named_sync m_named_sync;
  54. class named_sem_callbacks : public windows_named_sync_interface
  55. {
  56. public:
  57. typedef __int64 sem_count_t;
  58. named_sem_callbacks(winapi_semaphore_wrapper &sem_wrapper, sem_count_t sem_cnt)
  59. : m_sem_wrapper(sem_wrapper), m_sem_count(sem_cnt)
  60. {}
  61. virtual std::size_t get_data_size() const
  62. { return sizeof(sem_count_t); }
  63. virtual const void *buffer_with_final_data_to_file()
  64. { return &m_sem_count; }
  65. virtual const void *buffer_with_init_data_to_file()
  66. { return &m_sem_count; }
  67. virtual void *buffer_to_store_init_data_from_file()
  68. { return &m_sem_count; }
  69. virtual bool open(create_enum_t, const char *id_name)
  70. {
  71. std::string aux_str = "Global\\bipc.sem.";
  72. aux_str += id_name;
  73. //
  74. permissions sem_perm;
  75. sem_perm.set_unrestricted();
  76. bool created;
  77. return m_sem_wrapper.open_or_create
  78. ( aux_str.c_str(), static_cast<long>(m_sem_count)
  79. , winapi_semaphore_wrapper::MaxCount, sem_perm, created);
  80. }
  81. virtual void close()
  82. {
  83. m_sem_wrapper.close();
  84. }
  85. virtual ~named_sem_callbacks()
  86. {}
  87. private:
  88. sem_count_t m_sem_count;
  89. winapi_semaphore_wrapper& m_sem_wrapper;
  90. };
  91. #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED
  92. };
  93. inline windows_named_semaphore::~windows_named_semaphore()
  94. {
  95. named_sem_callbacks callbacks(m_sem_wrapper, m_sem_wrapper.value());
  96. m_named_sync.close(callbacks);
  97. }
  98. inline void windows_named_semaphore::dont_close_on_destruction()
  99. {}
  100. inline windows_named_semaphore::windows_named_semaphore
  101. (create_only_t, const char *name, unsigned int initial_count, const permissions &perm)
  102. : m_sem_wrapper()
  103. {
  104. named_sem_callbacks callbacks(m_sem_wrapper, initial_count);
  105. m_named_sync.open_or_create(DoCreate, name, perm, callbacks);
  106. }
  107. inline windows_named_semaphore::windows_named_semaphore
  108. (open_or_create_t, const char *name, unsigned int initial_count, const permissions &perm)
  109. : m_sem_wrapper()
  110. {
  111. named_sem_callbacks callbacks(m_sem_wrapper, initial_count);
  112. m_named_sync.open_or_create(DoOpenOrCreate, name, perm, callbacks);
  113. }
  114. inline windows_named_semaphore::windows_named_semaphore(open_only_t, const char *name)
  115. : m_sem_wrapper()
  116. {
  117. named_sem_callbacks callbacks(m_sem_wrapper, 0);
  118. m_named_sync.open_or_create(DoOpen, name, permissions(), callbacks);
  119. }
  120. inline void windows_named_semaphore::post()
  121. {
  122. m_sem_wrapper.post();
  123. }
  124. inline void windows_named_semaphore::wait()
  125. {
  126. m_sem_wrapper.wait();
  127. }
  128. inline bool windows_named_semaphore::try_wait()
  129. {
  130. return m_sem_wrapper.try_wait();
  131. }
  132. inline bool windows_named_semaphore::timed_wait(const boost::posix_time::ptime &abs_time)
  133. {
  134. return m_sem_wrapper.timed_wait(abs_time);
  135. }
  136. inline bool windows_named_semaphore::remove(const char *name)
  137. {
  138. return windows_named_sync::remove(name);
  139. }
  140. } //namespace ipcdetail {
  141. } //namespace interprocess {
  142. } //namespace boost {
  143. #include <boost/interprocess/detail/config_end.hpp>
  144. #endif //BOOST_INTERPROCESS_WINDOWS_NAMED_SEMAPHORE_HPP