From: Gerd Hoffmann Date: Fri, 13 Mar 2020 12:35:26 +0000 (+0000) Subject: Add exit notifiers. X-Git-Tag: xen-4.14.0~1 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=eb9bf793f5857ab5ca850bfecba4f11496881500;p=qemu-xen-unstable.git Add exit notifiers. Hook up any cleanup work which needs to be done here. Advantages over using atexit(3): (1) You get passed in a pointer to the notifier. If you embed that into your state struct you can use container_of() to get get your state info. (2) You can unregister, say when un-plugging a device. Signed-off-by: Anthony Liguori (cherry picked from commit fd42deeb4cb42f90084046e3ebdb4383953195e3) Signed-off-by: Maximilian Heyne Reviewed-by: Paul Durrant Acked-by: Ian Jackson --- diff --git a/sysemu.h b/sysemu.h index 968258a841..759d0e9d53 100644 --- a/sysemu.h +++ b/sysemu.h @@ -2,6 +2,8 @@ #define SYSEMU_H /* Misc. things related to the system emulator. */ +#include "notify.h" + /* vl.c */ extern const char *bios_name; extern const char *bios_dir; @@ -39,6 +41,9 @@ void qemu_system_powerdown(void); #endif void qemu_system_reset(void); +void qemu_add_exit_notifier(Notifier *notify); +void qemu_remove_exit_notifier(Notifier *notify); + void do_savevm(const char *name); void do_loadvm(const char *name); void do_delvm(const char *name); diff --git a/vl.c b/vl.c index c3c5d630e8..2163217ec7 100644 --- a/vl.c +++ b/vl.c @@ -282,6 +282,9 @@ uint8_t qemu_uuid[16]; #include "xen-vl-extra.c" +static NotifierList exit_notifiers = + NOTIFIER_LIST_INITIALIZER(exit_notifiers); + /***********************************************************/ /* x86 ISA bus support */ @@ -4843,6 +4846,21 @@ static void vcpu_hex_str_to_bitmap(const char *optarg) } } +void qemu_add_exit_notifier(Notifier *notify) +{ + notifier_list_add(&exit_notifiers, notify); +} + +void qemu_remove_exit_notifier(Notifier *notify) +{ + notifier_list_remove(notify); +} + +static void qemu_run_exit_notifiers(void) +{ + notifier_list_notify(&exit_notifiers); +} + int main(int argc, char **argv, char **envp) { #ifdef CONFIG_GDBSTUB @@ -4887,6 +4905,8 @@ int main(int argc, char **argv, char **envp) const char *chroot_dir = NULL; const char *run_as = NULL; + atexit(qemu_run_exit_notifiers); + qemu_cache_utils_init(envp); logfile = stderr; /* initial value */