task enter()

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