On 10/18/21 18:14, Alex Bennée wrote: > Philippe Mathieu-Daudé <[email protected]> writes: >> On 10/18/21 16:02, Alex Bennée wrote: >>> While there are a number of uses in the code-base of the exit(0) >>> pattern it gets in the way of clean exit which can do all of it's >>> house-keeping. In particular it was reported that you can crash >>> plugins this way because TCG can still be running on other threads >>> when the atexit callback is called. >>> >>> Use qemu_system_shutdown_request() instead. I did a gentle rename of >>> the runstate stub seeing as it now contains two functions. >>> >>> Signed-off-by: Alex Bennée <[email protected]> >>> Reported-by: Lukas Jünger <[email protected]> >>> --- >>> chardev/char-mux.c | 3 ++- >>> stubs/{runstate-check.c => runstate.c} | 5 +++++ >>> stubs/meson.build | 2 +- >>> 3 files changed, 8 insertions(+), 2 deletions(-) >>> rename stubs/{runstate-check.c => runstate.c} (64%) >>> >>> diff --git a/chardev/char-mux.c b/chardev/char-mux.c >>> index ada0c6866f..a46897fcd5 100644 >>> --- a/chardev/char-mux.c >>> +++ b/chardev/char-mux.c >>> @@ -28,6 +28,7 @@ >>> #include "qemu/option.h" >>> #include "chardev/char.h" >>> #include "sysemu/block-backend.h" >>> +#include "sysemu/runstate.h" >>> #include "chardev-internal.h" >>> >>> /* MUX driver for serial I/O splitting */ >>> @@ -157,7 +158,7 @@ static int mux_proc_byte(Chardev *chr, MuxChardev *d, >>> int ch) >>> { >>> const char *term = "QEMU: Terminated\n\r"; >>> qemu_chr_write_all(chr, (uint8_t *)term, strlen(term)); >>> - exit(0); >>> + >>> qemu_system_shutdown_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN); >>> break; >>> } >>> case 's': >>> diff --git a/stubs/runstate-check.c b/stubs/runstate.c >>> similarity index 64% >>> rename from stubs/runstate-check.c >>> rename to stubs/runstate.c >>> index 2ccda2b70f..f47dbcd3e0 100644 >>> --- a/stubs/runstate-check.c >>> +++ b/stubs/runstate.c >>> @@ -5,3 +5,8 @@ bool runstate_check(RunState state) >>> { >>> return state == RUN_STATE_PRELAUNCH; >>> } >>> + >>> +void qemu_system_shutdown_request(ShutdownCause reason) >>> +{ >>> + return; >>> +} >> >> Hmm this isn't a stub anymore, this is the user-mode implementation. > > It is? I don't think any of the chardev code touches user-mode, I had to > add this because apparently other binaries link the libchardev code.
If it isn't then is should call g_assert_not_reached().
