[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC v1 16/25] qom: object_property_set/get: Add child recu
From: |
Peter Crosthwaite |
Subject: |
[Qemu-devel] [RFC v1 16/25] qom: object_property_set/get: Add child recursion |
Date: |
Thu, 15 May 2014 18:59:04 -0700 |
Allow giving a "/" delimiter to indicate that a property set/get is
accessing a property within a child. E.G. "foo/bar" will set the
"bar" property on child "foo". Multiple "/"s will traverse multiple
child levels.
Signed-off-by: Peter Crosthwaite <address@hidden>
---
qom/object.c | 27 +++++++++++++++++++++++++--
1 file changed, 25 insertions(+), 2 deletions(-)
diff --git a/qom/object.c b/qom/object.c
index e42b254..a23ccb1 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -772,6 +772,29 @@ ObjectProperty *object_property_find(Object *obj, const
char *name,
return NULL;
}
+static ObjectProperty *object_property_find_traverse(Object **obj,
+ const char **name,
+ Error **errp)
+{
+ const char *slash = strchr(*name, '/');
+
+ if (slash) {
+ Error *err = NULL;
+ char *child_name = g_strndup(*name, slash - *name);
+ *obj = object_property_get_link(*obj, child_name, &err);
+ g_free(child_name);
+ if (err) {
+ error_propagate(errp, err);
+ } else {
+ *name = slash + 1;
+ return object_property_find_traverse(obj, name, errp);
+ }
+ return NULL;
+ }
+
+ return object_property_find(*obj, *name, errp);
+}
+
void object_property_del(Object *obj, const char *name, Error **errp)
{
ObjectProperty *prop = object_property_find(obj, name, errp);
@@ -793,7 +816,7 @@ void object_property_del(Object *obj, const char *name,
Error **errp)
void object_property_get(Object *obj, Visitor *v, const char *name,
Error **errp)
{
- ObjectProperty *prop = object_property_find(obj, name, errp);
+ ObjectProperty *prop = object_property_find_traverse(&obj, &name, errp);
if (prop == NULL) {
return;
}
@@ -808,7 +831,7 @@ void object_property_get(Object *obj, Visitor *v, const
char *name,
void object_property_set(Object *obj, Visitor *v, const char *name,
Error **errp)
{
- ObjectProperty *prop = object_property_find(obj, name, errp);
+ ObjectProperty *prop = object_property_find_traverse(&obj, &name, errp);
if (prop == NULL) {
return;
}
--
1.9.3.1.ga73a6ad
- [Qemu-devel] [RFC v1 09/25] memory: MemoryRegion: Add size property, (continued)
- [Qemu-devel] [RFC v1 12/25] qdev: gpio: Don't allow name share between I and O, Peter Crosthwaite, 2014/05/15
- [Qemu-devel] [RFC v1 13/25] qdev: gpio: Register GPIO inputs as child objects, Peter Crosthwaite, 2014/05/15
- [Qemu-devel] [RFC v1 14/25] qdev: gpio: Register GPIO outputs as QOM links, Peter Crosthwaite, 2014/05/15
- [Qemu-devel] [RFC v1 15/25] qdev: gpio: Re-impement qdev_connect_gpio QOM style, Peter Crosthwaite, 2014/05/15
- [Qemu-devel] [RFC v1 16/25] qom: object_property_set/get: Add child recursion,
Peter Crosthwaite <=
- [Qemu-devel] [RFC v1 17/25] sysbus: Use TYPE_DEVICE GPIO functionality, Peter Crosthwaite, 2014/05/15
- [Qemu-devel] [RFC v1 18/25] sysbus: Rework sysbus_mmio_map to use mr QOMification, Peter Crosthwaite, 2014/05/15
- [Qemu-devel] [RFC v1 19/25] sysbus: Setup memory regions as dynamic props, Peter Crosthwaite, 2014/05/15
- [Qemu-devel] [RFC v1 20/25] sysbus: Enable hotplug., Peter Crosthwaite, 2014/05/15
- [Qemu-devel] [RFC v1 21/25] microblaze: s3adsp: Expand UART creator, Peter Crosthwaite, 2014/05/15
- [Qemu-devel] [RFC v1 22/25] microblaze: s3adsp: Parent devices with sane names, Peter Crosthwaite, 2014/05/15
- [Qemu-devel] [RFC v1 23/25] timer: xilinx_timer: Convert to realize(), Peter Crosthwaite, 2014/05/15
- [Qemu-devel] [RFC v1 24/25] timer: xilinx_timer: init MMIO ASAP, Peter Crosthwaite, 2014/05/15