bool waitFor()

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;
  }