named_semaphore.hpp 5.1 KB

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