named_semaphore.hpp 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  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/sync/windows/named_sync.hpp>
  25. #include <boost/interprocess/sync/windows/winapi_semaphore_wrapper.hpp>
  26. namespace boost {
  27. namespace interprocess {
  28. namespace ipcdetail {
  29. class winapi_named_semaphore
  30. {
  31. #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED)
  32. //Non-copyable
  33. winapi_named_semaphore();
  34. winapi_named_semaphore(const winapi_named_semaphore &);
  35. winapi_named_semaphore &operator=(const winapi_named_semaphore &);
  36. #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED
  37. public:
  38. winapi_named_semaphore(create_only_t, const char *name, unsigned int initialCount, const permissions &perm = permissions());
  39. winapi_named_semaphore(open_or_create_t, const char *name, unsigned int initialCount, const permissions &perm = permissions());
  40. winapi_named_semaphore(open_only_t, const char *name);
  41. winapi_named_semaphore(create_only_t, const wchar_t *name, unsigned int initialCount, const permissions &perm = permissions());
  42. winapi_named_semaphore(open_or_create_t, const wchar_t *name, unsigned int initialCount, const permissions &perm = permissions());
  43. winapi_named_semaphore(open_only_t, const wchar_t *name);
  44. ~winapi_named_semaphore();
  45. void post();
  46. void wait();
  47. bool try_wait();
  48. template<class TimePoint> bool timed_wait(const TimePoint &abs_time);
  49. static bool remove(const char *name);
  50. static bool remove(const wchar_t *name);
  51. #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED)
  52. private:
  53. friend class interprocess_tester;
  54. void dont_close_on_destruction();
  55. winapi_semaphore_wrapper m_sem_wrapper;
  56. windows_named_sync m_named_sync;
  57. class named_sem_callbacks : public windows_named_sync_interface
  58. {
  59. public:
  60. typedef __int64 sem_count_t;
  61. named_sem_callbacks(winapi_semaphore_wrapper &sem_wrapper, sem_count_t sem_cnt)
  62. : m_sem_wrapper(sem_wrapper), m_sem_count(sem_cnt)
  63. {}
  64. virtual std::size_t get_data_size() const BOOST_OVERRIDE
  65. { return sizeof(sem_count_t); }
  66. virtual const void *buffer_with_final_data_to_file() BOOST_OVERRIDE
  67. { return &m_sem_count; }
  68. virtual const void *buffer_with_init_data_to_file() BOOST_OVERRIDE
  69. { return &m_sem_count; }
  70. virtual void *buffer_to_store_init_data_from_file() BOOST_OVERRIDE
  71. { return &m_sem_count; }
  72. virtual bool open(create_enum_t, const char *id_name) BOOST_OVERRIDE
  73. {
  74. std::string aux_str = "Global\\bipc.sem.";
  75. aux_str += id_name;
  76. //
  77. permissions sem_perm;
  78. sem_perm.set_unrestricted();
  79. bool created;
  80. return m_sem_wrapper.open_or_create
  81. ( aux_str.c_str(), static_cast<long>(m_sem_count)
  82. , winapi_semaphore_wrapper::MaxCount, sem_perm, created);
  83. }
  84. virtual bool open(create_enum_t, const wchar_t *id_name) BOOST_OVERRIDE
  85. {
  86. std::wstring aux_str = L"Global\\bipc.sem.";
  87. aux_str += id_name;
  88. //
  89. permissions sem_perm;
  90. sem_perm.set_unrestricted();
  91. bool created;
  92. return m_sem_wrapper.open_or_create
  93. ( aux_str.c_str(), static_cast<long>(m_sem_count)
  94. , winapi_semaphore_wrapper::MaxCount, sem_perm, created);
  95. }
  96. virtual void close() BOOST_OVERRIDE
  97. {
  98. m_sem_wrapper.close();
  99. }
  100. virtual ~named_sem_callbacks() BOOST_OVERRIDE
  101. {}
  102. private:
  103. winapi_semaphore_wrapper& m_sem_wrapper;
  104. sem_count_t m_sem_count;
  105. };
  106. #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED
  107. };
  108. inline winapi_named_semaphore::~winapi_named_semaphore()
  109. {
  110. named_sem_callbacks callbacks(m_sem_wrapper, m_sem_wrapper.value());
  111. m_named_sync.close(callbacks);
  112. }
  113. inline void winapi_named_semaphore::dont_close_on_destruction()
  114. {}
  115. inline winapi_named_semaphore::winapi_named_semaphore
  116. (create_only_t, const char *name, unsigned int initial_count, const permissions &perm)
  117. : m_sem_wrapper()
  118. {
  119. named_sem_callbacks callbacks(m_sem_wrapper, initial_count);
  120. m_named_sync.open_or_create(DoCreate, name, perm, callbacks);
  121. }
  122. inline winapi_named_semaphore::winapi_named_semaphore
  123. (open_or_create_t, const char *name, unsigned int initial_count, const permissions &perm)
  124. : m_sem_wrapper()
  125. {
  126. named_sem_callbacks callbacks(m_sem_wrapper, initial_count);
  127. m_named_sync.open_or_create(DoOpenOrCreate, name, perm, callbacks);
  128. }
  129. inline winapi_named_semaphore::winapi_named_semaphore(open_only_t, const char *name)
  130. : m_sem_wrapper()
  131. {
  132. named_sem_callbacks callbacks(m_sem_wrapper, 0);
  133. m_named_sync.open_or_create(DoOpen, name, permissions(), callbacks);
  134. }
  135. inline winapi_named_semaphore::winapi_named_semaphore
  136. (create_only_t, const wchar_t *name, unsigned int initial_count, const permissions &perm)
  137. : m_sem_wrapper()
  138. {
  139. named_sem_callbacks callbacks(m_sem_wrapper, initial_count);
  140. m_named_sync.open_or_create(DoCreate, name, perm, callbacks);
  141. }
  142. inline winapi_named_semaphore::winapi_named_semaphore
  143. (open_or_create_t, const wchar_t *name, unsigned int initial_count, const permissions &perm)
  144. : m_sem_wrapper()
  145. {
  146. named_sem_callbacks callbacks(m_sem_wrapper, initial_count);
  147. m_named_sync.open_or_create(DoOpenOrCreate, name, perm, callbacks);
  148. }
  149. inline winapi_named_semaphore::winapi_named_semaphore(open_only_t, const wchar_t *name)
  150. : m_sem_wrapper()
  151. {
  152. named_sem_callbacks callbacks(m_sem_wrapper, 0);
  153. m_named_sync.open_or_create(DoOpen, name, permissions(), callbacks);
  154. }
  155. inline void winapi_named_semaphore::post()
  156. {
  157. m_sem_wrapper.post();
  158. }
  159. inline void winapi_named_semaphore::wait()
  160. {
  161. m_sem_wrapper.wait();
  162. }
  163. inline bool winapi_named_semaphore::try_wait()
  164. {
  165. return m_sem_wrapper.try_wait();
  166. }
  167. template<class TimePoint>
  168. inline bool winapi_named_semaphore::timed_wait(const TimePoint &abs_time)
  169. {
  170. return m_sem_wrapper.timed_wait(abs_time);
  171. }
  172. inline bool winapi_named_semaphore::remove(const char *name)
  173. {
  174. return windows_named_sync::remove(name);
  175. }
  176. inline bool winapi_named_semaphore::remove(const wchar_t *name)
  177. {
  178. return windows_named_sync::remove(name);
  179. }
  180. } //namespace ipcdetail {
  181. } //namespace interprocess {
  182. } //namespace boost {
  183. #include <boost/interprocess/detail/config_end.hpp>
  184. #endif //BOOST_INTERPROCESS_WINDOWS_NAMED_SEMAPHORE_HPP