diff --git a/src/libipc/platform/waiter_linux.h b/src/libipc/platform/waiter_linux.h index d8ff4ef..58a6363 100755 --- a/src/libipc/platform/waiter_linux.h +++ b/src/libipc/platform/waiter_linux.h @@ -258,20 +258,23 @@ public: } private: + using wait_flags = waiter_helper::wait_flags; + using wait_counter = waiter_helper::wait_counter; + mutex lock_; - waiter_helper::wait_counter cnt_; + wait_counter cnt_; struct contrl { waiter_holder * me_; - waiter_helper::wait_flags * flags_; + wait_flags * flags_; handle_t const & h_; - waiter_helper::wait_flags & flags() noexcept { + wait_flags & flags() noexcept { assert(flags_ != nullptr); return *flags_; } - waiter_helper::wait_counter & counter() noexcept { + wait_counter & counter() noexcept { return me_->cnt_; } @@ -297,8 +300,6 @@ private: }; public: - using wait_flags = waiter_helper::wait_flags; - handle_t open_h(ipc::string && name) { auto sem = sem_helper::open(("__WAITER_HELPER_SEM__" + name).c_str(), 0); if (sem == sem_helper::invalid()) { @@ -334,7 +335,14 @@ public: bool wait_if(handle_t const & h, wait_flags * flags, F&& pred, std::size_t tm = invalid_value) { assert(flags != nullptr); contrl ctrl { this, flags, h }; - return waiter_helper::wait_if(ctrl, mtx, std::forward(pred), tm); + + class non_mutex { + public: + void lock () noexcept {} + void unlock() noexcept {} + } nm; + + return waiter_helper::wait_if(ctrl, nm, std::forward(pred), tm); } bool notify(handle_t const & h) { @@ -385,7 +393,7 @@ public: } template - bool wait_if(handle_t h, waiter_holder::wait_flags * flags, F && pred, std::size_t tm = invalid_value) { + bool wait_if(handle_t h, waiter_helper::wait_flags * flags, F && pred, std::size_t tm = invalid_value) { if (h == invalid()) return false; return helper_.wait_if(h, flags, std::forward(pred), tm); } @@ -400,7 +408,7 @@ public: return helper_.broadcast(h); } - bool quit_waiting(handle_t h, waiter_holder::wait_flags * flags) { + bool quit_waiting(handle_t h, waiter_helper::wait_flags * flags) { if (h == invalid()) return false; return helper_.quit_waiting(h, flags); } diff --git a/src/libipc/platform/waiter_win.h b/src/libipc/platform/waiter_win.h index 155cadb..05e318f 100755 --- a/src/libipc/platform/waiter_win.h +++ b/src/libipc/platform/waiter_win.h @@ -78,20 +78,23 @@ public: }; class condition { + using wait_flags = waiter_helper::wait_flags; + using wait_counter = waiter_helper::wait_counter; + mutex lock_; semaphore sema_, handshake_; - waiter_helper::wait_counter * cnt_ = nullptr; + wait_counter * cnt_ = nullptr; struct contrl { condition * me_; - waiter_helper::wait_flags * flags_; + wait_flags * flags_; - waiter_helper::wait_flags & flags() noexcept { + wait_flags & flags() noexcept { assert(flags_ != nullptr); return *flags_; } - waiter_helper::wait_counter & counter() noexcept { + wait_counter & counter() noexcept { assert(me_->cnt_ != nullptr); return *(me_->cnt_); } @@ -118,8 +121,6 @@ class condition { }; public: - using wait_flags = waiter_helper::wait_flags; - friend bool operator==(condition const & c1, condition const & c2) { return c1.cnt_ == c2.cnt_; } @@ -134,7 +135,7 @@ public: mutex ::remove((ipc::string{ "__COND_MTX__" } + name).c_str()); } - bool open(ipc::string const & name, waiter_helper::wait_counter * cnt) { + bool open(ipc::string const & name, wait_counter * cnt) { if (lock_ .open("__COND_MTX__" + name) && sema_ .open("__COND_SEM__" + name) && handshake_.open("__COND_HAN__" + name)) { @@ -201,7 +202,7 @@ public: } template - bool wait_if(handle_t& h, handle_t::wait_flags * flags, F&& pred, std::size_t tm = invalid_value) { + bool wait_if(handle_t& h, waiter_helper::wait_flags * flags, F&& pred, std::size_t tm = invalid_value) { if (h == invalid()) return false; class non_mutex { @@ -223,7 +224,7 @@ public: return h.broadcast(); } - bool quit_waiting(handle_t& h, handle_t::wait_flags * flags) { + bool quit_waiting(handle_t& h, waiter_helper::wait_flags * flags) { if (h == invalid()) return false; return h.quit_waiting(flags); } diff --git a/src/libipc/platform/waiter_wrapper.h b/src/libipc/platform/waiter_wrapper.h index bbb9902..553d2e1 100755 --- a/src/libipc/platform/waiter_wrapper.h +++ b/src/libipc/platform/waiter_wrapper.h @@ -24,7 +24,7 @@ class condition_impl : public ipc::detail::condition { using base_t = ipc::detail::condition; ipc::shm::handle cnt_h_; - base_t::wait_flags flags_; + waiter_helper::wait_flags flags_; public: static void remove(char const * name) { @@ -192,7 +192,7 @@ public: private: waiter_t* w_ = nullptr; waiter_t::handle_t h_ = waiter_t::invalid(); - waiter_t::handle_t::wait_flags flags_; + waiter_helper::wait_flags flags_; public: waiter_wrapper() = default;