bool inplace_stop_source::try_lock_unless_stop_requested()

in source/inplace_stop_token.cpp [96:120]


bool inplace_stop_source::try_lock_unless_stop_requested(
    bool setStopRequested) noexcept {
  spin_wait spin;
  auto oldState = state_.load(std::memory_order_relaxed);
  do {
    while (true) {
      if ((oldState & stop_requested_flag) != 0) {
        // Stop already requested.
        return false;
      } else if (oldState == 0) {
        break;
      } else {
        spin.wait();
        oldState = state_.load(std::memory_order_relaxed);
      }
    }
  } while (!state_.compare_exchange_weak(
      oldState,
      setStopRequested ? (locked_flag | stop_requested_flag) : locked_flag,
      std::memory_order_acq_rel,
      std::memory_order_relaxed));

  // Lock acquired successfully
  return true;
}