Skip to content

Commit a1cdc9a

Browse files
committed
In non-broadcast mode, connection tags are only used for counting.
1 parent 87b1fa4 commit a1cdc9a

File tree

3 files changed

+16
-7
lines changed

3 files changed

+16
-7
lines changed

src/libipc/circ/elem_def.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,10 @@ class conn_head<P, true> : public conn_head_base {
7474
return this->cc_.fetch_and(~cc_id, std::memory_order_acq_rel) & ~cc_id;
7575
}
7676

77+
bool connected(cc_t cc_id) const noexcept {
78+
return (this->connections() & cc_id) != 0;
79+
}
80+
7781
std::size_t conn_count(std::memory_order order = std::memory_order_acquire) const noexcept {
7882
cc_t cur = this->cc_.load(order);
7983
cc_t cnt; // accumulates the total bits set in cc
@@ -100,6 +104,11 @@ class conn_head<P, false> : public conn_head_base {
100104
}
101105
}
102106

107+
bool connected(cc_t cc_id) const noexcept {
108+
// In non-broadcast mode, connection tags are only used for counting.
109+
return (this->connections() != 0) && (cc_id != 0);
110+
}
111+
103112
std::size_t conn_count(std::memory_order order = std::memory_order_acquire) const noexcept {
104113
return this->connections(order);
105114
}

src/libipc/ipc.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -628,7 +628,7 @@ static ipc::buff_t recv(ipc::handle_t h, std::uint64_t tm) {
628628
// pop a new message
629629
typename queue_t::value_t msg {};
630630
if (!wait_for(inf->rd_waiter_, [que, &msg, &h] {
631-
if (!que->connected(que->elems())) {
631+
if (!que->connected()) {
632632
reconnect(&h, true);
633633
}
634634
return !que->pop(msg);

src/libipc/queue.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,9 @@ class queue_conn {
6363
shm::handle::clear_storage(name);
6464
}
6565

66-
bool connected() const noexcept {
67-
return connected_ != 0;
68-
}
69-
7066
template <typename Elems>
71-
bool connected(Elems* elems) noexcept {
72-
return connected_ & elems->connections();
67+
bool connected(Elems* elems) const noexcept {
68+
return elems->connected(connected_);
7369
}
7470

7571
circ::cc_t connected_id() const noexcept {
@@ -155,6 +151,10 @@ class queue_base : public queue_conn {
155151
elems_->disconnect_sender();
156152
}
157153

154+
bool connected() const noexcept {
155+
return base_t::connected(elems_);
156+
}
157+
158158
bool connect() noexcept {
159159
auto tp = base_t::connect(elems_);
160160
if (std::get<0>(tp) && std::get<1>(tp)) {

0 commit comments

Comments
 (0)