From 99a98013a497bf9cc97defcba3311e31ea7a44bb Mon Sep 17 00:00:00 2001 From: Jerry Zhao Date: Wed, 8 Mar 2023 15:48:44 -0800 Subject: interactive: Improve ctrlc responsiveness * Move most ctrl-c logic to interactive() * 5f4cabc was only a partial fix. This change catches more corner cases where the ctrlc is registered Signed-off-by: Jerry Zhao --- riscv/interactive.cc | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/riscv/interactive.cc b/riscv/interactive.cc index 8ad7592..d9fb39b 100644 --- a/riscv/interactive.cc +++ b/riscv/interactive.cc @@ -252,7 +252,13 @@ static std::string readline(int fd) void sim_t::interactive() { + if (ctrlc_pressed) { + next_interactive_action = std::nullopt; + ctrlc_pressed = false; + } + if (next_interactive_action.has_value()) { + ctrlc_pressed = false; auto f = next_interactive_action.value(); next_interactive_action = std::nullopt; return f(); @@ -400,14 +406,13 @@ void sim_t::interactive_run_silent(const std::string& cmd, const std::vector& args, bool noisy) { size_t steps = args.size() ? atoll(args[0].c_str()) : -1; - ctrlc_pressed = false; set_procs_debug(noisy); const size_t actual_steps = std::min(INTERLEAVE, steps); for (size_t i = 0; i < actual_steps && !ctrlc_pressed && !done(); i++) step(1); - if (actual_steps < steps && !ctrlc_pressed) { + if (actual_steps < steps) { next_interactive_action = [=](){ interactive_run(cmd, {std::to_string(steps - actual_steps)}, noisy); }; return; } @@ -741,8 +746,6 @@ void sim_t::interactive_until(const std::string& cmd, const std::vector