From 46e1c5482b78d908849b4e3d46ac668572c683d1 Mon Sep 17 00:00:00 2001 From: Eduardo Habkost Date: Sun, 11 Mar 2018 14:37:36 -0400 Subject: [PATCH] machine: Set MachineClass::name automatically Now all TYPE_MACHINE subclasses use MACHINE_TYPE_NAME to generate the class name. So instead of requiring each subclass to set MachineClass::name manually, we can now set it automatically at the TYPE_MACHINE class_base_init() function. Backports commit 98cec76a7076c4a38e16f1a9de170a7942b3be54 from qemu --- qemu/hw/arm/virt.c | 4 +--- qemu/hw/core/machine.c | 5 ++++- qemu/hw/core/qdev.c | 2 +- qemu/include/qom/object.h | 4 ++-- qemu/qom/object.c | 6 +++--- qemu/vl.c | 1 - 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/qemu/hw/arm/virt.c b/qemu/hw/arm/virt.c index 0b55fdfd..fe6d2206 100644 --- a/qemu/hw/arm/virt.c +++ b/qemu/hw/arm/virt.c @@ -50,8 +50,7 @@ typedef struct { bool secure; } VirtMachineState; -#define VIRT_MACHINE_NAME "virt" -#define TYPE_VIRT_MACHINE MACHINE_TYPE_NAME(VIRT_MACHINE_NAME) +#define TYPE_VIRT_MACHINE MACHINE_TYPE_NAME("virt") #define VIRT_MACHINE(uc, obj) \ OBJECT_CHECK((uc), VirtMachineState, (obj), TYPE_VIRT_MACHINE) #define VIRT_MACHINE_GET_CLASS(uc, obj) \ @@ -121,7 +120,6 @@ static void virt_class_init(struct uc_struct *uc, ObjectClass *oc, void *data) { MachineClass *mc = MACHINE_CLASS(uc, oc); - mc->name = VIRT_MACHINE_NAME; mc->init = machvirt_init; mc->max_cpus = 8; mc->is_default = 1; diff --git a/qemu/hw/core/machine.c b/qemu/hw/core/machine.c index 996b931f..4681cb55 100644 --- a/qemu/hw/core/machine.c +++ b/qemu/hw/core/machine.c @@ -15,11 +15,14 @@ #include "qapi/error.h" #include "qemu/cutils.h" -static void machine_class_base_init(ObjectClass *oc, void *data) +static void machine_class_base_init(struct uc_struct *uc, ObjectClass *oc, void *data) { if (!object_class_is_abstract(oc)) { + MachineClass *mc = MACHINE_CLASS(uc, oc); const char *cname = object_class_get_name(oc); assert(g_str_has_suffix(cname, TYPE_MACHINE_SUFFIX)); + mc->name = g_strndup(cname, + strlen(cname) - strlen(TYPE_MACHINE_SUFFIX)); } } diff --git a/qemu/hw/core/qdev.c b/qemu/hw/core/qdev.c index aaa4ec84..584bf865 100644 --- a/qemu/hw/core/qdev.c +++ b/qemu/hw/core/qdev.c @@ -271,7 +271,7 @@ static void device_finalize(struct uc_struct *uc, Object *obj, void *opaque) { } -static void device_class_base_init(ObjectClass *class, void *data) +static void device_class_base_init(struct uc_struct *uc, ObjectClass *class, void *data) { } diff --git a/qemu/include/qom/object.h b/qemu/include/qom/object.h index 7e9abc6a..63cb6ebd 100644 --- a/qemu/include/qom/object.h +++ b/qemu/include/qom/object.h @@ -489,8 +489,8 @@ struct TypeInfo void *class_data; void (*class_init)(struct uc_struct *uc, ObjectClass *klass, void *data); - void (*class_base_init)(ObjectClass *klass, void *data); - void (*class_finalize)(ObjectClass *klass, void *data); + void (*class_base_init)(struct uc_struct *uc, ObjectClass *klass, void *data); + void (*class_finalize)(struct uc_struct *uc, ObjectClass *klass, void *data); bool abstract; diff --git a/qemu/qom/object.c b/qemu/qom/object.c index f459276a..5ef74649 100644 --- a/qemu/qom/object.c +++ b/qemu/qom/object.c @@ -48,8 +48,8 @@ struct TypeImpl void *instance_userdata; void (*class_init)(struct uc_struct *uc, ObjectClass *klass, void *data); - void (*class_base_init)(ObjectClass *klass, void *data); - void (*class_finalize)(ObjectClass *klass, void *data); + void (*class_base_init)(struct uc_struct *uc, ObjectClass *klass, void *data); + void (*class_finalize)(struct uc_struct *uc, ObjectClass *klass, void *data); void *class_data; @@ -320,7 +320,7 @@ static void type_initialize(struct uc_struct *uc, TypeImpl *ti) while (parent) { if (parent->class_base_init) { - parent->class_base_init(ti->class, ti->class_data); + parent->class_base_init(uc, ti->class, ti->class_data); } parent = type_get_parent(uc, parent); } diff --git a/qemu/vl.c b/qemu/vl.c index a04b4b9b..518efce8 100644 --- a/qemu/vl.c +++ b/qemu/vl.c @@ -182,7 +182,6 @@ static void machine_class_init(struct uc_struct *uc, ObjectClass *oc, void *data MachineClass *mc = MACHINE_CLASS(uc, oc); QEMUMachine *qm = data; - mc->name = qm->name; mc->init = qm->init; mc->max_cpus = qm->max_cpus; mc->is_default = qm->is_default;