summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162>2009-04-17 18:06:46 +0000
committeraliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162>2009-04-17 18:06:46 +0000
commit00f56b3dcfd20ad053706342a848951051a760ea (patch)
tree3da60c793b30ca15168f288d2258138dca977159
parent71dc1b6fcba9a77deed7fd24ee1c56bee10ec063 (diff)
downloadqemu-00f56b3dcfd20ad053706342a848951051a760ea.tar.gz
Add unregister_savevm() (Mark McLoughlin)
Currently there's no way to unregister a savevm callback, so e.g. if a NIC is hot-unplugged and a savevm is issued, we'll segfault. Signed-off-by: Mark McLoughlin <markmc@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/branches/stable_0_10@7158 c046a42c-6fe2-441c-8c8c-71466251a162
-rw-r--r--hw/hw.h2
-rw-r--r--savevm.c16
2 files changed, 18 insertions, 0 deletions
diff --git a/hw/hw.h b/hw/hw.h
index e9628d46fb..d0cf598204 100644
--- a/hw/hw.h
+++ b/hw/hw.h
@@ -239,6 +239,8 @@ int register_savevm_live(const char *idstr,
LoadStateHandler *load_state,
void *opaque);
+void unregister_savevm(const char *idstr, void *opaque);
+
typedef void QEMUResetHandler(void *opaque);
void qemu_register_reset(QEMUResetHandler *func, void *opaque);
diff --git a/savevm.c b/savevm.c
index e1808c69d6..e3e853cf22 100644
--- a/savevm.c
+++ b/savevm.c
@@ -643,6 +643,22 @@ int register_savevm(const char *idstr,
NULL, save_state, load_state, opaque);
}
+void unregister_savevm(const char *idstr, void *opaque)
+{
+ SaveStateEntry **pse;
+
+ pse = &first_se;
+ while (*pse != NULL) {
+ if (strcmp((*pse)->idstr, idstr) == 0 && (*pse)->opaque == opaque) {
+ SaveStateEntry *next = (*pse)->next;
+ qemu_free(*pse);
+ *pse = next;
+ continue;
+ }
+ pse = &(*pse)->next;
+ }
+}
+
#define QEMU_VM_FILE_MAGIC 0x5145564d
#define QEMU_VM_FILE_VERSION_COMPAT 0x00000002
#define QEMU_VM_FILE_VERSION 0x00000003