in include/unifex/stop_immediately.hpp [258:294]
void start() noexcept {
auto stopToken = get_stop_token(receiver_);
if (stopToken.stop_requested()) {
unifex::set_done(std::move(receiver_));
return;
}
static_assert(
std::is_same_v<decltype(stopToken), ST>);
UNIFEX_TRY {
stream_.nextOp_.construct_with([&] {
return unifex::connect(
next(stream_.source_),
next_receiver{stream_});
});
stream_.nextReceiver_ = &concreteReceiver_;
stream_.state_.store(
state::source_next_active, std::memory_order_relaxed);
UNIFEX_TRY {
stopCallback_.construct(
std::move(stopToken),
cancel_next_callback{stream_});
unifex::start(stream_.nextOp_.get());
} UNIFEX_CATCH (...) {
stream_.nextReceiver_ = nullptr;
stream_.nextOp_.destruct();
stream_.state_.store(
state::source_next_completed, std::memory_order_relaxed);
unifex::set_error(std::move(receiver_), std::current_exception());
}
} UNIFEX_CATCH (...) {
stream_.state_.store(
state::source_next_completed, std::memory_order_relaxed);
unifex::set_error(std::move(receiver_), std::current_exception());
}
}