in Source/Shared/arcana/scheduling/state_machine.h [26:49]
task<T, std::error_code> move_to(state_machine_state<T>& state, cancellation& cancel)
{
completions stateTasks{};
{
std::lock_guard<std::mutex> guard{ m_mutex };
stateTasks = fetch_state(state);
}
stateTasks.StateEntered->complete(expected<void, std::error_code>::make_valid());
std::shared_ptr<cancellation_data> listener = std::make_shared<cancellation_data>(cancel.add_listener([this, &state]
{
cancel_exit(state);
}));
return stateTasks.StateExited.unsafe_cast<T, std::error_code>().as_task()
.then(inline_scheduler, cancellation::none(),
[listener = std::move(listener)](const arcana::expected<T, std::error_code>& result) mutable noexcept
{
listener.reset();
return result;
});
}