Add qemu_unregister_reset
authorJan Kiszka <jan.kiszka@siemens.com>
Wed, 1 Jul 2009 22:19:02 +0000 (00:19 +0200)
committerAnthony Liguori <aliguori@us.ibm.com>
Thu, 16 Jul 2009 13:28:12 +0000 (08:28 -0500)
Will be used by '-boot once=...', and should also help in other use
cases.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>

hw/hw.h
vl.c

diff --git a/hw/hw.h b/hw/hw.h
index c2c0ac0..1e5783d 100644 (file)
--- 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 841146a..963b899 100644 (file)
--- 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);
     }
 }