arduino-nofrendo icon indicating copy to clipboard operation
arduino-nofrendo copied to clipboard

Attempting to stop emulator reboots ESP32

Open and3rson opened this issue 10 months ago • 1 comments

When stopping nofrendo using input that's triggering quit event, an assertion fails which leads to this line being called:

https://github.com/moononournation/arduino-nofrendo/blob/c5ba6d39c1fff0ceed314b76f6da5145d0d99bcc/src/log.c#L143

exit does not do what's intended as opposed to other platforms (it simply reboots the ESP32), and thus it makes it impossible to gracefully exit nofrendo. Basically, this means thatnofrendo_main never returns - the only way out is a reboot.

I think a sensible solution would be to replace exit & atexit with a different mechanism, for example setjmp.

E.g.:

// nofrendo.c

jmp_buf nofrendo_exit_jmp;

int main_loop(...) {
    if (setjmp(nofrendo_exit_jmp) == 0) {
        // Proceed with current implementation of main_loop - init OSD/GUI & start the game
        // ...
        return 0;
    } else {
        shutdown_everything();
        return 1;
    }
}
// log.c

extern jmp_buf nofrendo_exit_jmp;

void nofrendo_log_assert(...) {
    // log message
    // ...
    // then, instead of exit(), call longjmp()
    longjmp(nofrendo_exit_jmp, 1);
}

We implemented a similar pattern when we integrated Lua into our ESP32 project, and it works perfectly for cases when "everything is bad, abort all operations and go back to a known path" approach is needed.

and3rson avatar Apr 14 '24 09:04 and3rson

Fixed in #18.

and3rson avatar Apr 29 '24 22:04 and3rson