diff --git a/src/main.c b/src/main.c index 1c1c4ec..235b0ca 100644 --- a/src/main.c +++ b/src/main.c @@ -95,6 +95,21 @@ static void check_keyevents(void) { } } +__attribute__((noreturn)) void halt(void) { + term_kprint("SYSTEM HALTED"); + + set_statusbar(tick_ctr, shift_state, alpha_state, get_battery_voltage()); + set_menubar(); + + dclear(C_BLACK); + tgrid_display(); + dupdate(); + + while (1) { + getkey(); + } +} + int main(int isappli, int optnum) { term_kprintf("main(%d, %d)", isappli, optnum); @@ -166,7 +181,8 @@ int main(int isappli, int optnum) { // first, backup current scheduler context const int ret = setjmp(sched_ctxbuf); - if (ret == 0) { + switch (ret) { + case 0: // pause timer during sheduler operations, we restart it before resuming a job timer_pause(timer_sched); @@ -174,34 +190,24 @@ int main(int isappli, int optnum) { timer_start(timer_sched); must_yield = 0; job_resume(current_job_id); - } else if (ret == 1) { + break; + case 1: job_GC(current_job_id); // term_kprintf("job(%d) yield", current_job_id); continue; - } else if (ret == 2) { + break; + case 2: term_kprintf("job(%d) exit", current_job_id); job_free(current_job_id); - } else { + break; + default: __builtin_unreachable(); term_kprint("SHOULD NOT BE REACHED!!!"); - break; + halt(); } } - term_eprint("SYSTEM HALTED"); - - set_statusbar(tick_ctr, shift_state, alpha_state, get_battery_voltage()); - set_menubar(); - - dclear(C_BLACK); - tgrid_display(); - dupdate(); - - while (1) { - getkey(); - } - - __builtin_unreachable(); + halt(); return 1; } \ No newline at end of file