[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 14/26] object: add direct link flag
From: |
Marc-André Lureau |
Subject: |
[PATCH 14/26] object: add direct link flag |
Date: |
Sun, 1 Dec 2019 15:15:19 +0400 |
Allow the link property to hold the pointer to the target, instead of
indirectly through another variable.
Signed-off-by: Marc-André Lureau <address@hidden>
---
include/qom/object.h | 3 +++
qom/object.c | 26 ++++++++++++++++++++------
2 files changed, 23 insertions(+), 6 deletions(-)
diff --git a/include/qom/object.h b/include/qom/object.h
index 0ac1a9acca..9bef5783f1 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -1509,6 +1509,9 @@ void object_property_add_child(Object *obj, const char
*name,
typedef enum {
/* Unref the link pointer when the property is deleted */
OBJ_PROP_LINK_STRONG = 0x1,
+
+ /* private */
+ OBJ_PROP_LINK_DIRECT = 0x2,
} ObjectPropertyLinkFlags;
/**
diff --git a/qom/object.c b/qom/object.c
index 6f3800c693..d9fc71c284 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -1696,17 +1696,30 @@ void object_property_allow_set_link(const Object *obj,
const char *name,
}
typedef struct {
- Object **targetp;
+ union {
+ Object **targetp;
+ Object *target; /* if OBJ_PROP_LINK_DIRECT, when holding the pointer
*/
+ };
void (*check)(const Object *, const char *, Object *, Error **);
ObjectPropertyLinkFlags flags;
} LinkProperty;
+static Object **
+object_link_get_targetp(Object *obj, LinkProperty *lprop)
+{
+ if (lprop->flags & OBJ_PROP_LINK_DIRECT) {
+ return &lprop->target;
+ } else {
+ return lprop->targetp;
+ }
+}
+
static void object_get_link_property(Object *obj, Visitor *v,
const char *name, void *opaque,
Error **errp)
{
LinkProperty *lprop = opaque;
- Object **targetp = lprop->targetp;
+ Object **targetp = object_link_get_targetp(obj, lprop);
gchar *path;
if (*targetp) {
@@ -1765,7 +1778,7 @@ static void object_set_link_property(Object *obj, Visitor
*v,
{
Error *local_err = NULL;
LinkProperty *prop = opaque;
- Object **targetp = prop->targetp;
+ Object **targetp = object_link_get_targetp(obj, prop);
Object *old_target = *targetp;
Object *new_target = NULL;
char *path = NULL;
@@ -1799,16 +1812,17 @@ static Object *object_resolve_link_property(Object
*parent, void *opaque, const
{
LinkProperty *lprop = opaque;
- return *lprop->targetp;
+ return *object_link_get_targetp(parent, lprop);
}
static void object_release_link_property(Object *obj, const char *name,
void *opaque)
{
LinkProperty *prop = opaque;
+ Object **targetp = object_link_get_targetp(obj, prop);
- if ((prop->flags & OBJ_PROP_LINK_STRONG) && *prop->targetp) {
- object_unref(*prop->targetp);
+ if ((prop->flags & OBJ_PROP_LINK_STRONG) && *targetp) {
+ object_unref(*targetp);
}
g_free(prop);
}
--
2.24.0
- Re: [PATCH 04/26] qdev: move helper function to monitor/misc, (continued)
- [PATCH 05/26] object: avoid extra class property key duplication, Marc-André Lureau, 2019/12/01
- [PATCH 06/26] object: add class property initializer, Marc-André Lureau, 2019/12/01
- [PATCH 07/26] object: add object_property_get_defaut(), Marc-André Lureau, 2019/12/01
- [PATCH 08/26] object: make object_class_property_add* return property, Marc-André Lureau, 2019/12/01
- [PATCH 09/26] qstring: add qstring_free(), Marc-André Lureau, 2019/12/01
- [PATCH 10/26] object: add object_property_set_defaut_{bool, str, int, uint}(), Marc-André Lureau, 2019/12/01
- [PATCH 11/26] object: do not free class properties, Marc-André Lureau, 2019/12/01
- [PATCH 12/26] object: check strong flag with &, Marc-André Lureau, 2019/12/01
- [PATCH 13/26] object: rename link "child" to "target", Marc-André Lureau, 2019/12/01
- [PATCH 14/26] object: add direct link flag,
Marc-André Lureau <=
- [PATCH 15/26] object: express const link with link property, Marc-André Lureau, 2019/12/01
- [PATCH 16/26] object: add object_class_property_add_link(), Marc-André Lureau, 2019/12/01
- [PATCH 17/26] object: release all props, Marc-André Lureau, 2019/12/01
- [PATCH 18/26] object: return self in object_ref(), Marc-André Lureau, 2019/12/01
- [PATCH 20/26] qdev: move instance properties to class properties, Marc-André Lureau, 2019/12/01
- [PATCH 21/26] qdev: register properties as class properties, Marc-André Lureau, 2019/12/01
- [PATCH 19/26] qdev: set properties with device_class_set_props(), Marc-André Lureau, 2019/12/01
- [PATCH 22/26] vl: print default value in object help, Marc-André Lureau, 2019/12/01
- [PATCH 23/26] qom: simplify qmp_device_list_properties(), Marc-André Lureau, 2019/12/01
- [PATCH 24/26] qom: introduce object_property_help(), Marc-André Lureau, 2019/12/01