Fixed issue 107 and 123, receiver check connection when pop msg failed, and call reconnect function when the connection check result is false

This commit is contained in:
yongke liu 2025-05-09 17:10:07 +08:00
parent 120d85a2c4
commit 87b1fa4abc
2 changed files with 12 additions and 4 deletions

View File

@ -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.

View File

@ -67,6 +67,11 @@ public:
return connected_ != 0;
}
template <typename Elems>
bool connected(Elems* elems) noexcept {
return connected_ & elems->connections();
}
circ::cc_t connected_id() const noexcept {
return connected_;
}
@ -77,16 +82,16 @@ public:
-> std::tuple<bool, bool, decltype(std::declval<Elems>().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 <typename Elems>
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;
}