[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH qom-next 2/7] qom: Add get_id
From: |
Andreas Färber |
Subject: |
[Qemu-devel] [PATCH qom-next 2/7] qom: Add get_id |
Date: |
Thu, 7 Jun 2012 21:31:00 +0200 |
From: Paolo Bonzini <address@hidden>
Some classes may present objects differently in errors, for example if they
are not part of the composition tree or if they are not assigned an id by
the user. Let them do this with a get_id method on Object, and use the
method consistently where a %(device) appears in the error.
Signed-off-by: Paolo Bonzini <address@hidden>
[AF: Renamed _object_get_id() to object_instance_get_id(), avoid ?:.]
[AF: Use object_property_is_child().]
Signed-off-by: Andreas Färber <address@hidden>
---
hw/qdev-properties.c | 6 +++---
hw/qdev.c | 15 ++++++++++++++-
include/qemu/object.h | 11 +++++++++++
qom/object.c | 26 +++++++++++++++++++++++++-
4 files changed, 53 insertions(+), 5 deletions(-)
diff --git a/hw/qdev-properties.c b/hw/qdev-properties.c
index fcc0bed..4dc03f6 100644
--- a/hw/qdev-properties.c
+++ b/hw/qdev-properties.c
@@ -937,16 +937,16 @@ void error_set_from_qdev_prop_error(Error **errp, int
ret, DeviceState *dev,
switch (ret) {
case -EEXIST:
error_set(errp, QERR_PROPERTY_VALUE_IN_USE,
- object_get_typename(OBJECT(dev)), prop->name, value);
+ object_get_id(OBJECT(dev)), prop->name, value);
break;
default:
case -EINVAL:
error_set(errp, QERR_PROPERTY_VALUE_BAD,
- object_get_typename(OBJECT(dev)), prop->name, value);
+ object_get_id(OBJECT(dev)), prop->name, value);
break;
case -ENOENT:
error_set(errp, QERR_PROPERTY_VALUE_NOT_FOUND,
- object_get_typename(OBJECT(dev)), prop->name, value);
+ object_get_id(OBJECT(dev)), prop->name, value);
break;
case 0:
break;
diff --git a/hw/qdev.c b/hw/qdev.c
index c12e151..7304e4c 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -259,7 +259,7 @@ void qdev_init_nofail(DeviceState *dev)
{
if (qdev_init(dev) < 0) {
error_report("Initialization of device %s failed",
- object_get_typename(OBJECT(dev)));
+ object_get_id(OBJECT(dev)));
exit(1);
}
}
@@ -716,6 +716,13 @@ static void device_finalize(Object *obj)
}
}
+static const char *qdev_get_id(Object *obj)
+{
+ DeviceState *dev = DEVICE(obj);
+
+ return dev->id != NULL ? dev->id : object_get_typename(obj);
+}
+
static void device_class_base_init(ObjectClass *class, void *data)
{
DeviceClass *klass = DEVICE_CLASS(class);
@@ -746,6 +753,11 @@ Object *qdev_get_machine(void)
return dev;
}
+static void device_class_init(ObjectClass *class, void *data)
+{
+ class->get_id = qdev_get_id;
+}
+
static TypeInfo device_type_info = {
.name = TYPE_DEVICE,
.parent = TYPE_OBJECT,
@@ -753,6 +765,7 @@ static TypeInfo device_type_info = {
.instance_init = device_initfn,
.instance_finalize = device_finalize,
.class_base_init = device_class_base_init,
+ .class_init = device_class_init,
.abstract = true,
.class_size = sizeof(DeviceClass),
};
diff --git a/include/qemu/object.h b/include/qemu/object.h
index 1606777..81e0280 100644
--- a/include/qemu/object.h
+++ b/include/qemu/object.h
@@ -239,6 +239,9 @@ struct ObjectClass
{
/*< private >*/
Type type;
+
+ /*< public >*/
+ const char *(*get_id)(Object *);
};
typedef enum ObjectState {
@@ -507,6 +510,14 @@ Object *object_dynamic_cast(Object *obj, const char
*typename);
Object *object_dynamic_cast_assert(Object *obj, const char *typename);
/**
+ * object_get_id:
+ * @obj: A derivative of #Object
+ *
+ * Returns: A string that can be used to refer to @obj.
+ */
+const char *object_get_id(Object *obj);
+
+/**
* object_get_class:
* @obj: A derivative of #Object
*
diff --git a/qom/object.c b/qom/object.c
index 93e0499..02464e1 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -346,6 +346,24 @@ static void object_property_del_child(Object *obj, Object
*child, Error **errp)
}
}
+static const char *object_instance_get_id(Object *obj)
+{
+ ObjectProperty *prop;
+
+ QTAILQ_FOREACH(prop, &obj->properties, node) {
+ if (object_property_is_child(prop) && prop->opaque == obj) {
+ return prop->name;
+ }
+ }
+
+ return "";
+}
+
+const char *object_get_id(Object *obj)
+{
+ return obj->class->get_id(obj);
+}
+
void object_unparent(Object *obj)
{
if (obj->parent) {
@@ -685,7 +703,7 @@ ObjectProperty *object_property_find(Object *obj, const
char *name,
}
}
- error_set(errp, QERR_PROPERTY_NOT_FOUND, "", name);
+ error_set(errp, QERR_PROPERTY_NOT_FOUND, object_get_id(obj), name);
return NULL;
}
@@ -1249,6 +1267,11 @@ static void object_instance_init(Object *obj)
object_property_add_str(obj, "type", qdev_get_type, NULL, NULL);
}
+static void object_class_init(ObjectClass *klass, void *class_data)
+{
+ klass->get_id = object_instance_get_id;
+}
+
static void register_types(void)
{
static TypeInfo interface_info = {
@@ -1261,6 +1284,7 @@ static void register_types(void)
.name = TYPE_OBJECT,
.instance_size = sizeof(Object),
.instance_init = object_instance_init,
+ .class_init = object_class_init,
.abstract = true,
};
--
1.7.7
- Re: [Qemu-devel] [PATCH qom-next 1/7] qdev: Push state up to Object, (continued)
- Re: [Qemu-devel] [PATCH qom-next 1/7] qdev: Push state up to Object, Paolo Bonzini, 2012/06/10
- Re: [Qemu-devel] [PATCH qom-next 1/7] qdev: Push state up to Object, Anthony Liguori, 2012/06/10
- Re: [Qemu-devel] [PATCH qom-next 1/7] qdev: Push state up to Object, Andreas Färber, 2012/06/10
- Re: [Qemu-devel] [PATCH qom-next 1/7] qdev: Push state up to Object, Kevin Wolf, 2012/06/11
- Re: [Qemu-devel] [PATCH qom-next 1/7] qdev: Push state up to Object, Anthony Liguori, 2012/06/11
- Re: [Qemu-devel] [PATCH qom-next 1/7] qdev: Push state up to Object, Kevin Wolf, 2012/06/11
- Re: [Qemu-devel] [PATCH qom-next 1/7] qdev: Push state up to Object, Andreas Färber, 2012/06/11
- Re: [Qemu-devel] [PATCH qom-next 1/7] qdev: Push state up to Object, Andreas Färber, 2012/06/11
- Re: [Qemu-devel] [PATCH qom-next 1/7] qdev: Push state up to Object, Anthony Liguori, 2012/06/11
- Re: [Qemu-devel] [PATCH qom-next 1/7] qdev: Push state up to Object, Andreas Färber, 2012/06/11
[Qemu-devel] [PATCH qom-next 2/7] qom: Add get_id,
Andreas Färber <=
[Qemu-devel] [PATCH qom-next 3/7] qdev: Generalize properties to Objects, Andreas Färber, 2012/06/07
[Qemu-devel] [PATCH qom-next 4/7] qdev: Move bulk of qdev-properties.c to qom/object-properties.c, Andreas Färber, 2012/06/07