From 87b1fa4abc461703511d005416566b1cf3fd6f02 Mon Sep 17 00:00:00 2001 From: yongke liu Date: Fri, 9 May 2025 17:10:07 +0800 Subject: [PATCH] Fixed issue 107 and 123, receiver check connection when pop msg failed, and call reconnect function when the connection check result is false --- src/libipc/ipc.cpp | 5 ++++- src/libipc/queue.h | 11 ++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/libipc/ipc.cpp b/src/libipc/ipc.cpp index 7d919dd..9a5b025 100755 --- a/src/libipc/ipc.cpp +++ b/src/libipc/ipc.cpp @@ -627,7 +627,10 @@ static ipc::buff_t recv(ipc::handle_t h, std::uint64_t tm) { for (;;) { // pop a new message typename queue_t::value_t msg {}; - if (!wait_for(inf->rd_waiter_, [que, &msg] { + if (!wait_for(inf->rd_waiter_, [que, &msg, &h] { + if (!que->connected(que->elems())) { + reconnect(&h, true); + } return !que->pop(msg); }, tm)) { // pop failed, just return. diff --git a/src/libipc/queue.h b/src/libipc/queue.h index 71dc170..8177d0c 100755 --- a/src/libipc/queue.h +++ b/src/libipc/queue.h @@ -67,6 +67,11 @@ class queue_conn { return connected_ != 0; } + template + bool connected(Elems* elems) noexcept { + return connected_ & elems->connections(); + } + circ::cc_t connected_id() const noexcept { return connected_; } @@ -77,16 +82,16 @@ class queue_conn { -> std::tuple().cursor())> { if (elems == nullptr) return {}; // if it's already connected, just return - if (connected()) return {connected(), false, 0}; + if (connected(elems)) return {connected(elems), false, 0}; connected_ = elems->connect_receiver(); - return {connected(), true, elems->cursor()}; + return {connected(elems), true, elems->cursor()}; } template bool disconnect(Elems* elems) noexcept { if (elems == nullptr) return false; // if it's already disconnected, just return false - if (!connected()) return false; + if (!connected(elems)) return false; elems->disconnect_receiver(std::exchange(connected_, 0)); return true; }