bool inplace_stop_source::request_stop()

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