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