File indexing completed on 2026-09-22 08:30:45
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #ifndef BOOST_INTERPROCESS_WINDOWS_NAMED_SEMAPHORE_HPP
0012 #define BOOST_INTERPROCESS_WINDOWS_NAMED_SEMAPHORE_HPP
0013
0014 #ifndef BOOST_CONFIG_HPP
0015 # include <boost/config.hpp>
0016 #endif
0017 0018 ">#
0019 #if defined(BOOST_HAS_PRAGMA_ONCE)
0020 # pragma once
0021 #endif
0022
0023 #include <boost/interprocess/detail/config_begin.hpp>
0024 #include <boost/interprocess/detail/workaround.hpp>
0025 #include <boost/interprocess/creation_tags.hpp>
0026 #include <boost/interprocess/permissions.hpp>
0027 #include <boost/interprocess/detail/interprocess_tester.hpp>
0028 #include <boost/interprocess/sync/windows/named_sync.hpp>
0029 #include <boost/interprocess/sync/windows/winapi_semaphore_wrapper.hpp>
0030
0031 namespace boost {
0032 namespace interprocess {
0033 namespace ipcdetail {
0034
0035
0036
0037 class winapi_named_semaphore
0038 {
0039 #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED)
0040
0041
0042 winapi_named_semaphore();
0043 winapi_named_semaphore(const winapi_named_semaphore &);
0044 winapi_named_semaphore &operator=(const winapi_named_semaphore &);
0045 #endif
0046
0047 public:
0048 winapi_named_semaphore(create_only_t, const char *name, unsigned int initialCount, const permissions &perm = permissions());
0049
0050 winapi_named_semaphore(open_or_create_t, const char *name, unsigned int initialCount, const permissions &perm = permissions());
0051
0052 winapi_named_semaphore(open_only_t, const char *name);
0053
0054 winapi_named_semaphore(create_only_t, const wchar_t *name, unsigned int initialCount, const permissions &perm = permissions());
0055
0056 winapi_named_semaphore(open_or_create_t, const wchar_t *name, unsigned int initialCount, const permissions &perm = permissions());
0057
0058 winapi_named_semaphore(open_only_t, const wchar_t *name);
0059
0060 ~winapi_named_semaphore();
0061
0062 void post();
0063 void wait();
0064 bool try_wait();
0065 template<class TimePoint> bool timed_wait(const TimePoint &abs_time);
0066
0067 static bool remove(const char *name);
0068 static bool remove(const wchar_t *name);
0069
0070 #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED)
0071 private:
0072 friend class interprocess_tester;
0073 void dont_close_on_destruction();
0074 winapi_semaphore_wrapper m_sem_wrapper;
0075 windows_named_sync m_named_sync;
0076
0077 class named_sem_callbacks : public windows_named_sync_interface
0078 {
0079 public:
0080 typedef __int64 sem_count_t;
0081 named_sem_callbacks(winapi_semaphore_wrapper &sem_wrapper, sem_count_t sem_cnt)
0082 : m_sem_wrapper(sem_wrapper), m_sem_count(sem_cnt)
0083 {}
0084
0085 virtual std::size_t get_data_size() const BOOST_OVERRIDE
0086 { return sizeof(sem_count_t); }
0087
0088 virtual const void *buffer_with_final_data_to_file() BOOST_OVERRIDE
0089 { return &m_sem_count; }
0090
0091 virtual const void *buffer_with_init_data_to_file() BOOST_OVERRIDE
0092 { return &m_sem_count; }
0093
0094 virtual void *buffer_to_store_init_data_from_file() BOOST_OVERRIDE
0095 { return &m_sem_count; }
0096
0097 virtual bool open(create_enum_t, const char *id_name) BOOST_OVERRIDE
0098 {
0099 std::string aux_str = "Global\\bipc.sem.";
0100 aux_str += id_name;
0101
0102 permissions sem_perm;
0103 sem_perm.set_unrestricted();
0104 bool created;
0105 return m_sem_wrapper.open_or_create
0106 ( aux_str.c_str(), static_cast<long>(m_sem_count)
0107 , winapi_semaphore_wrapper::MaxCount, sem_perm, created);
0108 }
0109
0110 virtual bool open(create_enum_t, const wchar_t *id_name) BOOST_OVERRIDE
0111 {
0112 std::wstring aux_str = L"Global\\bipc.sem.";
0113 aux_str += id_name;
0114
0115 permissions sem_perm;
0116 sem_perm.set_unrestricted();
0117 bool created;
0118 return m_sem_wrapper.open_or_create
0119 ( aux_str.c_str(), static_cast<long>(m_sem_count)
0120 , winapi_semaphore_wrapper::MaxCount, sem_perm, created);
0121 }
0122
0123 virtual void close() BOOST_OVERRIDE
0124 {
0125 m_sem_wrapper.close();
0126 }
0127
0128 virtual ~named_sem_callbacks() BOOST_OVERRIDE
0129 {}
0130
0131 private:
0132 winapi_semaphore_wrapper& m_sem_wrapper;
0133 sem_count_t m_sem_count;
0134 };
0135
0136 #endif
0137 };
0138
0139 inline winapi_named_semaphore::~winapi_named_semaphore()
0140 {
0141 named_sem_callbacks callbacks(m_sem_wrapper, m_sem_wrapper.value());
0142 m_named_sync.close(callbacks);
0143 }
0144
0145 inline void winapi_named_semaphore::dont_close_on_destruction()
0146 {}
0147
0148 inline winapi_named_semaphore::winapi_named_semaphore
0149 (create_only_t, const char *name, unsigned int initial_count, const permissions &perm)
0150 : m_sem_wrapper()
0151 {
0152 named_sem_callbacks callbacks(m_sem_wrapper, initial_count);
0153 m_named_sync.open_or_create(DoCreate, name, perm, callbacks);
0154 }
0155
0156 inline winapi_named_semaphore::winapi_named_semaphore
0157 (open_or_create_t, const char *name, unsigned int initial_count, const permissions &perm)
0158 : m_sem_wrapper()
0159 {
0160 named_sem_callbacks callbacks(m_sem_wrapper, initial_count);
0161 m_named_sync.open_or_create(DoOpenOrCreate, name, perm, callbacks);
0162 }
0163
0164 inline winapi_named_semaphore::winapi_named_semaphore(open_only_t, const char *name)
0165 : m_sem_wrapper()
0166 {
0167 named_sem_callbacks callbacks(m_sem_wrapper, 0);
0168 m_named_sync.open_or_create(DoOpen, name, permissions(), callbacks);
0169 }
0170
0171 inline winapi_named_semaphore::winapi_named_semaphore
0172 (create_only_t, const wchar_t *name, unsigned int initial_count, const permissions &perm)
0173 : m_sem_wrapper()
0174 {
0175 named_sem_callbacks callbacks(m_sem_wrapper, initial_count);
0176 m_named_sync.open_or_create(DoCreate, name, perm, callbacks);
0177 }
0178
0179 inline winapi_named_semaphore::winapi_named_semaphore
0180 (open_or_create_t, const wchar_t *name, unsigned int initial_count, const permissions &perm)
0181 : m_sem_wrapper()
0182 {
0183 named_sem_callbacks callbacks(m_sem_wrapper, initial_count);
0184 m_named_sync.open_or_create(DoOpenOrCreate, name, perm, callbacks);
0185 }
0186
0187 inline winapi_named_semaphore::winapi_named_semaphore(open_only_t, const wchar_t *name)
0188 : m_sem_wrapper()
0189 {
0190 named_sem_callbacks callbacks(m_sem_wrapper, 0);
0191 m_named_sync.open_or_create(DoOpen, name, permissions(), callbacks);
0192 }
0193
0194 inline void winapi_named_semaphore::post()
0195 {
0196 m_sem_wrapper.post();
0197 }
0198
0199 inline void winapi_named_semaphore::wait()
0200 {
0201 m_sem_wrapper.wait();
0202 }
0203
0204 inline bool winapi_named_semaphore::try_wait()
0205 {
0206 return m_sem_wrapper.try_wait();
0207 }
0208
0209 template<class TimePoint>
0210 inline bool winapi_named_semaphore::timed_wait(const TimePoint &abs_time)
0211 {
0212 return m_sem_wrapper.timed_wait(abs_time);
0213 }
0214
0215 inline bool winapi_named_semaphore::remove(const char *name)
0216 {
0217 return windows_named_sync::remove(name);
0218 }
0219
0220 inline bool winapi_named_semaphore::remove(const wchar_t *name)
0221 {
0222 return windows_named_sync::remove(name);
0223 }
0224
0225 }
0226 }
0227 }
0228
0229 #include <boost/interprocess/detail/config_end.hpp>
0230
0231 #endif