From dda9b29f61b198681346191a52be417bc195b0df Mon Sep 17 00:00:00 2001 From: Jan Kiszka Date: Thu, 2 Jul 2009 00:19:02 +0200 Subject: [PATCH] Add qemu_unregister_reset Will be used by '-boot once=...', and should also help in other use cases. Signed-off-by: Jan Kiszka Signed-off-by: Anthony Liguori --- hw/hw.h | 1 + vl.c | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/hw/hw.h b/hw/hw.h index c2c0ac0d7a..1e5783d973 100644 --- a/hw/hw.h +++ b/hw/hw.h @@ -261,6 +261,7 @@ void unregister_savevm(const char *idstr, void *opaque); typedef void QEMUResetHandler(void *opaque); void qemu_register_reset(QEMUResetHandler *func, void *opaque); +void qemu_unregister_reset(QEMUResetHandler *func, void *opaque); /* handler to set the boot_device order for a specific type of QEMUMachine */ /* return 0 if success */ diff --git a/vl.c b/vl.c index 841146a2b3..963b8999f7 100644 --- a/vl.c +++ b/vl.c @@ -3509,12 +3509,25 @@ void qemu_register_reset(QEMUResetHandler *func, void *opaque) TAILQ_INSERT_TAIL(&reset_handlers, re, entry); } -void qemu_system_reset(void) +void qemu_unregister_reset(QEMUResetHandler *func, void *opaque) { QEMUResetEntry *re; - /* reset all devices */ TAILQ_FOREACH(re, &reset_handlers, entry) { + if (re->func == func && re->opaque == opaque) { + TAILQ_REMOVE(&reset_handlers, re, entry); + qemu_free(re); + return; + } + } +} + +void qemu_system_reset(void) +{ + QEMUResetEntry *re, *nre; + + /* reset all devices */ + TAILQ_FOREACH_SAFE(re, &reset_handlers, entry, nre) { re->func(re->opaque); } }