Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-09-22 08:30:45

0001  //////////////////////////////////////////////////////////////////////////////
0002 //
0003 // (C) Copyright Ion Gaztanaga 2011-2012. Distributed under the Boost
0004 // Software License, Version 1.0. (See accompanying file
0005 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
0006 //
0007 // See http://www.boost.org/libs/interprocess for documentation.
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    //Non-copyable
0042    winapi_named_semaphore();
0043    winapi_named_semaphore(const winapi_named_semaphore &);
0044    winapi_named_semaphore &operator=(const winapi_named_semaphore &);
0045    #endif   //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED
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   //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED
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 }  //namespace ipcdetail {
0226 }  //namespace interprocess {
0227 }  //namespace boost {
0228 
0229 #include <boost/interprocess/detail/config_end.hpp>
0230 
0231 #endif   //BOOST_INTERPROCESS_WINDOWS_NAMED_SEMAPHORE_HPP