Skip to content

Commit 87b1fa4

Browse files
author
yongke liu
committed
Fixed issue 107 and 123, receiver check connection when pop msg failed, and call reconnect function when the connection check result is false
1 parent 120d85a commit 87b1fa4

File tree

2 files changed

+12
-4
lines changed

2 files changed

+12
-4
lines changed

src/libipc/ipc.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -627,7 +627,10 @@ static ipc::buff_t recv(ipc::handle_t h, std::uint64_t tm) {
627627
for (;;) {
628628
// pop a new message
629629
typename queue_t::value_t msg {};
630-
if (!wait_for(inf->rd_waiter_, [que, &msg] {
630+
if (!wait_for(inf->rd_waiter_, [que, &msg, &h] {
631+
if (!que->connected(que->elems())) {
632+
reconnect(&h, true);
633+
}
631634
return !que->pop(msg);
632635
}, tm)) {
633636
// pop failed, just return.

src/libipc/queue.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,11 @@ class queue_conn {
6767
return connected_ != 0;
6868
}
6969

70+
template <typename Elems>
71+
bool connected(Elems* elems) noexcept {
72+
return connected_ & elems->connections();
73+
}
74+
7075
circ::cc_t connected_id() const noexcept {
7176
return connected_;
7277
}
@@ -77,16 +82,16 @@ class queue_conn {
7782
-> std::tuple<bool, bool, decltype(std::declval<Elems>().cursor())> {
7883
if (elems == nullptr) return {};
7984
// if it's already connected, just return
80-
if (connected()) return {connected(), false, 0};
85+
if (connected(elems)) return {connected(elems), false, 0};
8186
connected_ = elems->connect_receiver();
82-
return {connected(), true, elems->cursor()};
87+
return {connected(elems), true, elems->cursor()};
8388
}
8489

8590
template <typename Elems>
8691
bool disconnect(Elems* elems) noexcept {
8792
if (elems == nullptr) return false;
8893
// if it's already disconnected, just return false
89-
if (!connected()) return false;
94+
if (!connected(elems)) return false;
9095
elems->disconnect_receiver(std::exchange(connected_, 0));
9196
return true;
9297
}

0 commit comments

Comments
 (0)