From 152b5515d27a5b089c5ace83ffadb4123d9a4f4c Mon Sep 17 00:00:00 2001 From: mutouyun Date: Sun, 10 Jan 2021 14:29:23 +0800 Subject: [PATCH] fix: recv may block after disconnect --- src/ipc.cpp | 2 +- src/libipc/waiter_helper.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ipc.cpp b/src/ipc.cpp index cd15a88..6731ba5 100755 --- a/src/ipc.cpp +++ b/src/ipc.cpp @@ -555,7 +555,7 @@ static ipc::buff_t recv(ipc::handle_t h, std::size_t tm) { recycle_storage(reinterpret_cast(ptr) - 1, size); }, reinterpret_cast(buf_id + 1) }; } - else ipc::log("fail: shm::handle for big message. msg_id: %zd, size: %zd\n", msg.id_, remain); + else ipc::log("fail: shm::handle for big message. msg_id: %zd, buf_id: %zd, size: %zd\n", msg.id_, buf_id, remain); } // gc if (rc.size() > 1024) { diff --git a/src/libipc/waiter_helper.h b/src/libipc/waiter_helper.h index ed267b6..c4dfc02 100644 --- a/src/libipc/waiter_helper.h +++ b/src/libipc/waiter_helper.h @@ -55,7 +55,7 @@ struct waiter_helper { } else if (flags.need_dest_.exchange(false, std::memory_order_release)) { ret = false; - ctrl.sema_wait(tm); + ctrl.sema_wait(default_timeout); break; } else { @@ -100,12 +100,13 @@ struct waiter_helper { ret = ret && ctrl.handshake_wait(default_timeout); } while (counter.counter_ > 0); } - return ret; + return ret; } template static bool quit_waiting(Ctrl & ctrl) { auto & flags = ctrl.flags(); + flags.need_dest_.store(true, std::memory_order_relaxed); if (!flags.is_waiting_.exchange(false, std::memory_order_release)) { return true; } @@ -116,7 +117,6 @@ struct waiter_helper { bool ret = true; IPC_UNUSED_ auto guard = ctrl.get_lock(); if (counter.counter_ > 0) { - flags.need_dest_.store(true, std::memory_order_relaxed); ret = ctrl.sema_post(counter.counter_); counter.counter_ -= 1; ret = ret && ctrl.handshake_wait(default_timeout);