in gloo/transport/tcp/pair.cc [1188:1232]
void Pair::signalException(std::exception_ptr ex) {
GLOO_ENFORCE(ex_ == nullptr);
// Loop through the buffers and signal that an error has occurred.
for (auto it = buffers_.begin(); it != buffers_.end(); it++) {
it->second->signalException(ex);
}
// Loop through posted send operations.
for (auto& op : tx_) {
if (op.buf != nullptr) {
op.buf->signalException(ex);
}
}
// Loop through pending send operations.
for (auto& it : localPendingSend_) {
for (auto& op : it.second) {
NonOwningPtr<UnboundBuffer> buf(std::get<0>(op));
if (buf) {
buf->signalException(ex);
}
}
}
// Loop through pending recv operations.
for (auto& it : localPendingRecv_) {
for (auto& op : it.second) {
NonOwningPtr<UnboundBuffer> buf(std::get<0>(op));
if (buf) {
buf->signalException(ex);
}
}
}
// Store exception_ptr and signal any threads in the async path.
ex_ = ex;
cv_.notify_all();
// Move to closed state.
// Either this error is an underlying socket error and the socket
// must be closed, or this error is an application side timeout, and
// we are no longer guaranteed that buffer pointers will be valid.
changeState(CLOSED);
}