From a1cdc9a711a1bdd0071283309a1d4fcdbdf337c7 Mon Sep 17 00:00:00 2001 From: mutouyun Date: Sat, 10 May 2025 15:14:39 +0800 Subject: [PATCH] In non-broadcast mode, connection tags are only used for counting. --- src/libipc/circ/elem_def.h | 9 +++++++++ src/libipc/ipc.cpp | 2 +- src/libipc/queue.h | 12 ++++++------ 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/libipc/circ/elem_def.h b/src/libipc/circ/elem_def.h index 24e4940..1b6c6ec 100755 --- a/src/libipc/circ/elem_def.h +++ b/src/libipc/circ/elem_def.h @@ -74,6 +74,10 @@ public: return this->cc_.fetch_and(~cc_id, std::memory_order_acq_rel) & ~cc_id; } + bool connected(cc_t cc_id) const noexcept { + return (this->connections() & cc_id) != 0; + } + std::size_t conn_count(std::memory_order order = std::memory_order_acquire) const noexcept { cc_t cur = this->cc_.load(order); cc_t cnt; // accumulates the total bits set in cc @@ -100,6 +104,11 @@ public: } } + bool connected(cc_t cc_id) const noexcept { + // In non-broadcast mode, connection tags are only used for counting. + return (this->connections() != 0) && (cc_id != 0); + } + std::size_t conn_count(std::memory_order order = std::memory_order_acquire) const noexcept { return this->connections(order); } diff --git a/src/libipc/ipc.cpp b/src/libipc/ipc.cpp index 9a5b025..e71dca9 100755 --- a/src/libipc/ipc.cpp +++ b/src/libipc/ipc.cpp @@ -628,7 +628,7 @@ static ipc::buff_t recv(ipc::handle_t h, std::uint64_t tm) { // pop a new message typename queue_t::value_t msg {}; if (!wait_for(inf->rd_waiter_, [que, &msg, &h] { - if (!que->connected(que->elems())) { + if (!que->connected()) { reconnect(&h, true); } return !que->pop(msg); diff --git a/src/libipc/queue.h b/src/libipc/queue.h index 8177d0c..86b4dfa 100755 --- a/src/libipc/queue.h +++ b/src/libipc/queue.h @@ -63,13 +63,9 @@ public: shm::handle::clear_storage(name); } - bool connected() const noexcept { - return connected_ != 0; - } - template - bool connected(Elems* elems) noexcept { - return connected_ & elems->connections(); + bool connected(Elems* elems) const noexcept { + return elems->connected(connected_); } circ::cc_t connected_id() const noexcept { @@ -155,6 +151,10 @@ public: elems_->disconnect_sender(); } + bool connected() const noexcept { + return base_t::connected(elems_); + } + bool connect() noexcept { auto tp = base_t::connect(elems_); if (std::get<0>(tp) && std::get<1>(tp)) {