in dispenso/detail/completion_event_impl.h [57:81]
bool waitFor(int completedStatus, const std::chrono::duration<double>& relTime) const {
if (status_.load(std::memory_order_acquire) == completedStatus) {
return true;
}
double relSeconds = relTime.count();
if (relSeconds <= 0.0) {
return false;
}
struct timespec ts;
ts.tv_sec = static_cast<time_t>(relSeconds);
relSeconds -= static_cast<double>(ts.tv_sec);
ts.tv_nsec = static_cast<long>(1e9 * relSeconds);
// TODO: determine if we should worry about reducing timeout time subsequent times through the
// loop in the case of spurious wake.
int current;
while ((current = status_.load(std::memory_order_acquire)) != completedStatus) {
if (futex(&ftx_, FUTEX_WAIT_PRIVATE, current, &ts, nullptr, 0) && errno == ETIMEDOUT) {
return false;
}
}
return true;
}