diff --git a/cpp/functions/core/process_runner.cpp b/cpp/functions/core/process_runner.cpp index efe5ab82..371ac6b3 100644 --- a/cpp/functions/core/process_runner.cpp +++ b/cpp/functions/core/process_runner.cpp @@ -1,10 +1,26 @@ #include "core/process_runner.h" +#include "core/process_state_machine.h" #include "core/tokens.h" #include #include namespace fn_ui { +// Helpers para puentear el RunnerState (publico) con la SM pura. +// RunnerState y ProcessState comparten orden y valores enteros (0..3). +namespace { +ProcessState to_ps(RunnerState s) { return static_cast(static_cast(s)); } +RunnerState to_rs(ProcessState s) { return static_cast(static_cast(s)); } + +// Aplica un evento al estado actual del runner via process_transition. +void apply_event(ProcessRunner& r, std::atomic& state, ProcessEvent ev) { + (void)r; + int cur = state.load(); + ProcessState ns = process_transition(to_ps(static_cast(cur)), ev); + state.store(static_cast(to_rs(ns))); +} +} // namespace + ProcessRunner::ProcessRunner() = default; ProcessRunner::~ProcessRunner() { @@ -26,7 +42,8 @@ std::string ProcessRunner::message() const { void ProcessRunner::reset() { if (is_busy()) return; - state_.store(static_cast(RunnerState::Idle)); + // Reset event: Success/Error -> Idle (no-op si ya en Idle). + apply_event(*this, state_, ProcessEvent::Reset); std::lock_guard lk(mu_); message_.clear(); } @@ -36,7 +53,9 @@ void runner_trigger(ProcessRunner& r, if (r.is_busy()) return; if (r.th_.joinable()) r.th_.join(); - r.state_.store(static_cast(RunnerState::Running)); + // Si venimos de Success/Error, primero Reset -> Idle, luego Spawned -> Running. + apply_event(r, r.state_, ProcessEvent::Reset); + apply_event(r, r.state_, ProcessEvent::Spawned); { std::lock_guard lk(r.mu_); r.message_.clear(); @@ -55,7 +74,8 @@ void runner_trigger(ProcessRunner& r, std::lock_guard lk(r.mu_); r.message_ = std::move(out); } - r.state_.store(static_cast(ok ? RunnerState::Success : RunnerState::Error)); + // Running -> Success/Error via SM pura. + apply_event(r, r.state_, ok ? ProcessEvent::Finished : ProcessEvent::Failed); }); } diff --git a/cpp/functions/core/process_runner.md b/cpp/functions/core/process_runner.md index 924ba5b1..a33fd46f 100644 --- a/cpp/functions/core/process_runner.md +++ b/cpp/functions/core/process_runner.md @@ -8,7 +8,7 @@ purity: impure signature: "class fn_ui::ProcessRunner { is_busy(); state(); message(); reset(); }; void runner_trigger(ProcessRunner&, std::function); void runner_status(const ProcessRunner&, const char* label)" description: "Ejecuta una tarea en std::thread en background y expone estado thread-safe (idle/running/success/error). Incluye widget inline con spinner + resultado." tags: [imgui, ui, async, thread, runner, tokens] -uses_functions: ["tokens_cpp_core"] +uses_functions: ["process_state_machine_cpp_core", "tokens_cpp_core"] uses_types: [] returns: [] returns_optional: false