in gloo/transport/uv/unbound_buffer.cc [54:81]
bool UnboundBuffer::waitRecv(int* rank, std::chrono::milliseconds timeout) {
std::unique_lock<std::mutex> lock(mutex_);
if (timeout == kUnsetTimeout) {
timeout = context_->getTimeout();
}
if (recvCompletions_ == 0) {
auto done = recvCv_.wait_for(
lock, timeout, [&] { return abortWaitRecv_ || recvCompletions_ > 0; });
if (!done) {
throw ::gloo::IoException(GLOO_ERROR_MSG(
"Timed out waiting ",
timeout.count(),
"ms for recv operation to complete"));
}
}
if (abortWaitRecv_) {
// Reset to false, so that only this waitRecv is interrupted
abortWaitRecv_ = false;
return false;
}
recvCompletions_--;
if (rank != nullptr) {
*rank = recvRank_;
}
return true;
}