in source/inplace_stop_token.cpp [37:73]
bool inplace_stop_source::request_stop() noexcept {
if (!try_lock_unless_stop_requested(true)) {
return true;
}
notifyingThreadId_ = std::this_thread::get_id();
// We are responsible for executing callbacks.
while (callbacks_ != nullptr) {
auto* callback = callbacks_;
callback->prevPtr_ = nullptr;
callbacks_ = callback->next_;
if (callbacks_ != nullptr) {
callbacks_->prevPtr_ = &callbacks_;
}
// unlock()
state_.store(stop_requested_flag, std::memory_order_release);
bool removedDuringCallback = false;
callback->removedDuringCallback_ = &removedDuringCallback;
callback->execute();
if (!removedDuringCallback) {
callback->removedDuringCallback_ = nullptr;
callback->callbackCompleted_.store(true, std::memory_order_release);
}
lock();
}
// unlock()
state_.store(stop_requested_flag, std::memory_order_release);
return false;
}