mirror of
https://github.com/mutouyun/cpp-ipc.git
synced 2025-12-06 16:56:45 +08:00
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:
parent
120d85a2c4
commit
87b1fa4abc
@ -627,7 +627,10 @@ static ipc::buff_t recv(ipc::handle_t h, std::uint64_t tm) {
|
|||||||
for (;;) {
|
for (;;) {
|
||||||
// pop a new message
|
// pop a new message
|
||||||
typename queue_t::value_t msg {};
|
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);
|
return !que->pop(msg);
|
||||||
}, tm)) {
|
}, tm)) {
|
||||||
// pop failed, just return.
|
// pop failed, just return.
|
||||||
|
|||||||
@ -67,6 +67,11 @@ public:
|
|||||||
return connected_ != 0;
|
return connected_ != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename Elems>
|
||||||
|
bool connected(Elems* elems) noexcept {
|
||||||
|
return connected_ & elems->connections();
|
||||||
|
}
|
||||||
|
|
||||||
circ::cc_t connected_id() const noexcept {
|
circ::cc_t connected_id() const noexcept {
|
||||||
return connected_;
|
return connected_;
|
||||||
}
|
}
|
||||||
@ -77,16 +82,16 @@ public:
|
|||||||
-> std::tuple<bool, bool, decltype(std::declval<Elems>().cursor())> {
|
-> std::tuple<bool, bool, decltype(std::declval<Elems>().cursor())> {
|
||||||
if (elems == nullptr) return {};
|
if (elems == nullptr) return {};
|
||||||
// if it's already connected, just 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();
|
connected_ = elems->connect_receiver();
|
||||||
return {connected(), true, elems->cursor()};
|
return {connected(elems), true, elems->cursor()};
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Elems>
|
template <typename Elems>
|
||||||
bool disconnect(Elems* elems) noexcept {
|
bool disconnect(Elems* elems) noexcept {
|
||||||
if (elems == nullptr) return false;
|
if (elems == nullptr) return false;
|
||||||
// if it's already disconnected, just 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));
|
elems->disconnect_receiver(std::exchange(connected_, 0));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user