提交 22ea40f4 编写于 作者: J Juan Quintela

savevm: Use a struct to pass all handlers

This would make easier to add more operations in the next patches.
Signed-off-by: NJuan Quintela <quintela@redhat.com>
上级 61dc008f
...@@ -1171,10 +1171,7 @@ typedef struct SaveStateEntry { ...@@ -1171,10 +1171,7 @@ typedef struct SaveStateEntry {
int alias_id; int alias_id;
int version_id; int version_id;
int section_id; int section_id;
SaveSetParamsHandler *set_params; SaveVMHandlers *ops;
SaveLiveStateHandler *save_live_state;
SaveStateHandler *save_state;
LoadStateHandler *load_state;
const VMStateDescription *vmsd; const VMStateDescription *vmsd;
void *opaque; void *opaque;
CompatEntry *compat; CompatEntry *compat;
...@@ -1237,10 +1234,11 @@ int register_savevm_live(DeviceState *dev, ...@@ -1237,10 +1234,11 @@ int register_savevm_live(DeviceState *dev,
se = g_malloc0(sizeof(SaveStateEntry)); se = g_malloc0(sizeof(SaveStateEntry));
se->version_id = version_id; se->version_id = version_id;
se->section_id = global_section_id++; se->section_id = global_section_id++;
se->set_params = set_params; se->ops = g_malloc0(sizeof(SaveVMHandlers));
se->save_live_state = save_live_state; se->ops->set_params = set_params;
se->save_state = save_state; se->ops->save_live_state = save_live_state;
se->load_state = load_state; se->ops->save_state = save_state;
se->ops->load_state = load_state;
se->opaque = opaque; se->opaque = opaque;
se->vmsd = NULL; se->vmsd = NULL;
se->no_migrate = 0; se->no_migrate = 0;
...@@ -1309,6 +1307,7 @@ void unregister_savevm(DeviceState *dev, const char *idstr, void *opaque) ...@@ -1309,6 +1307,7 @@ void unregister_savevm(DeviceState *dev, const char *idstr, void *opaque)
if (se->compat) { if (se->compat) {
g_free(se->compat); g_free(se->compat);
} }
g_free(se->ops);
g_free(se); g_free(se);
} }
} }
...@@ -1327,9 +1326,6 @@ int vmstate_register_with_alias_id(DeviceState *dev, int instance_id, ...@@ -1327,9 +1326,6 @@ int vmstate_register_with_alias_id(DeviceState *dev, int instance_id,
se = g_malloc0(sizeof(SaveStateEntry)); se = g_malloc0(sizeof(SaveStateEntry));
se->version_id = vmsd->version_id; se->version_id = vmsd->version_id;
se->section_id = global_section_id++; se->section_id = global_section_id++;
se->save_live_state = NULL;
se->save_state = NULL;
se->load_state = NULL;
se->opaque = opaque; se->opaque = opaque;
se->vmsd = vmsd; se->vmsd = vmsd;
se->alias_id = alias_id; se->alias_id = alias_id;
...@@ -1524,7 +1520,7 @@ void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd, ...@@ -1524,7 +1520,7 @@ void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd,
static int vmstate_load(QEMUFile *f, SaveStateEntry *se, int version_id) static int vmstate_load(QEMUFile *f, SaveStateEntry *se, int version_id)
{ {
if (!se->vmsd) { /* Old style */ if (!se->vmsd) { /* Old style */
return se->load_state(f, se->opaque, version_id); return se->ops->load_state(f, se->opaque, version_id);
} }
return vmstate_load_state(f, se->vmsd, se->opaque, version_id); return vmstate_load_state(f, se->vmsd, se->opaque, version_id);
} }
...@@ -1532,7 +1528,7 @@ static int vmstate_load(QEMUFile *f, SaveStateEntry *se, int version_id) ...@@ -1532,7 +1528,7 @@ static int vmstate_load(QEMUFile *f, SaveStateEntry *se, int version_id)
static void vmstate_save(QEMUFile *f, SaveStateEntry *se) static void vmstate_save(QEMUFile *f, SaveStateEntry *se)
{ {
if (!se->vmsd) { /* Old style */ if (!se->vmsd) { /* Old style */
se->save_state(f, se->opaque); se->ops->save_state(f, se->opaque);
return; return;
} }
vmstate_save_state(f,se->vmsd, se->opaque); vmstate_save_state(f,se->vmsd, se->opaque);
...@@ -1569,10 +1565,10 @@ int qemu_savevm_state_begin(QEMUFile *f, ...@@ -1569,10 +1565,10 @@ int qemu_savevm_state_begin(QEMUFile *f,
int ret; int ret;
QTAILQ_FOREACH(se, &savevm_handlers, entry) { QTAILQ_FOREACH(se, &savevm_handlers, entry) {
if(se->set_params == NULL) { if (!se->ops || !se->ops->set_params) {
continue; continue;
} }
se->set_params(params, se->opaque); se->ops->set_params(params, se->opaque);
} }
qemu_put_be32(f, QEMU_VM_FILE_MAGIC); qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
...@@ -1581,9 +1577,9 @@ int qemu_savevm_state_begin(QEMUFile *f, ...@@ -1581,9 +1577,9 @@ int qemu_savevm_state_begin(QEMUFile *f,
QTAILQ_FOREACH(se, &savevm_handlers, entry) { QTAILQ_FOREACH(se, &savevm_handlers, entry) {
int len; int len;
if (se->save_live_state == NULL) if (!se->ops || !se->ops->save_live_state) {
continue; continue;
}
/* Section type */ /* Section type */
qemu_put_byte(f, QEMU_VM_SECTION_START); qemu_put_byte(f, QEMU_VM_SECTION_START);
qemu_put_be32(f, se->section_id); qemu_put_be32(f, se->section_id);
...@@ -1596,7 +1592,7 @@ int qemu_savevm_state_begin(QEMUFile *f, ...@@ -1596,7 +1592,7 @@ int qemu_savevm_state_begin(QEMUFile *f,
qemu_put_be32(f, se->instance_id); qemu_put_be32(f, se->instance_id);
qemu_put_be32(f, se->version_id); qemu_put_be32(f, se->version_id);
ret = se->save_live_state(f, QEMU_VM_SECTION_START, se->opaque); ret = se->ops->save_live_state(f, QEMU_VM_SECTION_START, se->opaque);
if (ret < 0) { if (ret < 0) {
qemu_savevm_state_cancel(f); qemu_savevm_state_cancel(f);
return ret; return ret;
...@@ -1623,9 +1619,9 @@ int qemu_savevm_state_iterate(QEMUFile *f) ...@@ -1623,9 +1619,9 @@ int qemu_savevm_state_iterate(QEMUFile *f)
int ret = 1; int ret = 1;
QTAILQ_FOREACH(se, &savevm_handlers, entry) { QTAILQ_FOREACH(se, &savevm_handlers, entry) {
if (se->save_live_state == NULL) if (!se->ops || !se->ops->save_live_state) {
continue; continue;
}
if (qemu_file_rate_limit(f)) { if (qemu_file_rate_limit(f)) {
return 0; return 0;
} }
...@@ -1634,7 +1630,7 @@ int qemu_savevm_state_iterate(QEMUFile *f) ...@@ -1634,7 +1630,7 @@ int qemu_savevm_state_iterate(QEMUFile *f)
qemu_put_byte(f, QEMU_VM_SECTION_PART); qemu_put_byte(f, QEMU_VM_SECTION_PART);
qemu_put_be32(f, se->section_id); qemu_put_be32(f, se->section_id);
ret = se->save_live_state(f, QEMU_VM_SECTION_PART, se->opaque); ret = se->ops->save_live_state(f, QEMU_VM_SECTION_PART, se->opaque);
trace_savevm_section_end(se->section_id); trace_savevm_section_end(se->section_id);
if (ret <= 0) { if (ret <= 0) {
...@@ -1663,15 +1659,15 @@ int qemu_savevm_state_complete(QEMUFile *f) ...@@ -1663,15 +1659,15 @@ int qemu_savevm_state_complete(QEMUFile *f)
cpu_synchronize_all_states(); cpu_synchronize_all_states();
QTAILQ_FOREACH(se, &savevm_handlers, entry) { QTAILQ_FOREACH(se, &savevm_handlers, entry) {
if (se->save_live_state == NULL) if (!se->ops || !se->ops->save_live_state) {
continue; continue;
}
trace_savevm_section_start(); trace_savevm_section_start();
/* Section type */ /* Section type */
qemu_put_byte(f, QEMU_VM_SECTION_END); qemu_put_byte(f, QEMU_VM_SECTION_END);
qemu_put_be32(f, se->section_id); qemu_put_be32(f, se->section_id);
ret = se->save_live_state(f, QEMU_VM_SECTION_END, se->opaque); ret = se->ops->save_live_state(f, QEMU_VM_SECTION_END, se->opaque);
trace_savevm_section_end(se->section_id); trace_savevm_section_end(se->section_id);
if (ret < 0) { if (ret < 0) {
return ret; return ret;
...@@ -1681,9 +1677,9 @@ int qemu_savevm_state_complete(QEMUFile *f) ...@@ -1681,9 +1677,9 @@ int qemu_savevm_state_complete(QEMUFile *f)
QTAILQ_FOREACH(se, &savevm_handlers, entry) { QTAILQ_FOREACH(se, &savevm_handlers, entry) {
int len; int len;
if (se->save_state == NULL && se->vmsd == NULL) if ((!se->ops || !se->ops->save_state) && !se->vmsd) {
continue; continue;
}
trace_savevm_section_start(); trace_savevm_section_start();
/* Section type */ /* Section type */
qemu_put_byte(f, QEMU_VM_SECTION_FULL); qemu_put_byte(f, QEMU_VM_SECTION_FULL);
...@@ -1711,8 +1707,8 @@ void qemu_savevm_state_cancel(QEMUFile *f) ...@@ -1711,8 +1707,8 @@ void qemu_savevm_state_cancel(QEMUFile *f)
SaveStateEntry *se; SaveStateEntry *se;
QTAILQ_FOREACH(se, &savevm_handlers, entry) { QTAILQ_FOREACH(se, &savevm_handlers, entry) {
if (se->save_live_state) { if (se->ops && se->ops->save_live_state) {
se->save_live_state(f, -1, se->opaque); se->ops->save_live_state(f, -1, se->opaque);
} }
} }
} }
...@@ -1765,7 +1761,7 @@ static int qemu_save_device_state(QEMUFile *f) ...@@ -1765,7 +1761,7 @@ static int qemu_save_device_state(QEMUFile *f)
if (se->is_ram) { if (se->is_ram) {
continue; continue;
} }
if (se->save_state == NULL && se->vmsd == NULL) { if ((!se->ops || !se->ops->save_state) && !se->vmsd) {
continue; continue;
} }
......
...@@ -31,6 +31,13 @@ typedef void SaveStateHandler(QEMUFile *f, void *opaque); ...@@ -31,6 +31,13 @@ typedef void SaveStateHandler(QEMUFile *f, void *opaque);
typedef int SaveLiveStateHandler(QEMUFile *f, int stage, void *opaque); typedef int SaveLiveStateHandler(QEMUFile *f, int stage, void *opaque);
typedef int LoadStateHandler(QEMUFile *f, void *opaque, int version_id); typedef int LoadStateHandler(QEMUFile *f, void *opaque, int version_id);
typedef struct SaveVMHandlers {
SaveSetParamsHandler *set_params;
SaveStateHandler *save_state;
SaveLiveStateHandler *save_live_state;
LoadStateHandler *load_state;
} SaveVMHandlers;
int register_savevm(DeviceState *dev, int register_savevm(DeviceState *dev,
const char *idstr, const char *idstr,
int instance_id, int instance_id,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册