in dispenso/detail/completion_event_impl.h [148:171]
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;
}
mach_timespec_t ts;
ts.tv_sec = static_cast<uint32_t>(relSeconds);
relSeconds -= ts.tv_sec;
ts.tv_nsec = static_cast<clock_res_t>(1e9 * relSeconds);
// TODO: determine if we should worry about reducing timeout time subsequent times through the
// loop in the case of spurious wake.
while (status_.load(std::memory_order_acquire) != completedStatus) {
if (semaphore_timedwait(sem_, ts) == KERN_OPERATION_TIMED_OUT) {
return status_.load(std::memory_order_acquire) == completedStatus;
}
}
return true;
}