in Source/Shared/arcana/scheduling/state_machine.h [62:89]
task<void, std::error_code> enter(state_machine_state<T>& state, cancellation& cancel)
{
completions stateTasks{};
{
std::lock_guard<std::mutex> guard{ m_mutex };
auto& completion = fetch_state(state);
assert(!completion.WorkPending && "tried entering a node that is already entered");
completion.WorkPending = true;
stateTasks = completion;
}
std::shared_ptr<cancellation_data> listener = std::make_shared<cancellation_data>(cancel.add_listener([this, &state]
{
cancel_enter(state);
}));
return stateTasks.StateEntered->as_task()
.then(inline_scheduler, cancellation::none(),
[listener = std::move(listener)](const arcana::expected<void, std::error_code>& result) mutable noexcept
{
listener.reset();
return result;
});
}