Commit 721eafa5de for qemu.org
commit 721eafa5de92a1944502ad8ad8b59d344d35ccaa
Author: Marc-André Lureau <marcandre.lureau@redhat.com>
Date: Tue Jun 23 11:44:31 2026 +0400
ui/curses: implement display cleanup
Replace the atexit() handler with a proper cleanup callback. The new
curses_cleanup() unregisters the display listener, destroy & free the
allocated resources.
Reviewed-by: Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-ID: <20260623-b4-ui-v4-16-4656aec3398d@redhat.com>
diff --git a/ui/curses.c b/ui/curses.c
index 24d3713e57..4db32b6168 100644
--- a/ui/curses.c
+++ b/ui/curses.c
@@ -411,11 +411,19 @@ static void curses_refresh(DisplayChangeListener *dcl)
}
}
-static void curses_atexit(void)
+static void curses_cleanup(void)
{
+ if (!dcl) {
+ return;
+ }
+
endwin();
- g_free(vga_to_curses);
- g_free(screen);
+ qemu_console_unregister_listener(dcl);
+ g_clear_pointer(&dcl, g_free);
+ g_clear_pointer(&screenpad, delwin);
+ g_clear_pointer(&vga_to_curses, g_free);
+ g_clear_pointer(&screen, g_free);
+ g_clear_pointer(&kbd_layout, kbd_layout_free);
}
/*
@@ -799,8 +807,6 @@ static void curses_display_init(DisplayState *ds, DisplayOptions *opts)
vga_to_curses = g_new0(cchar_t, 256);
curses_setup();
curses_keyboard_setup();
- atexit(curses_atexit);
-
curses_winch_init();
dcl = g_new0(DisplayChangeListener, 1);
@@ -812,6 +818,7 @@ static void curses_display_init(DisplayState *ds, DisplayOptions *opts)
static QemuDisplay qemu_display_curses = {
.type = DISPLAY_TYPE_CURSES,
.init = curses_display_init,
+ .cleanup = curses_cleanup,
};
static void register_curses(void)