[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 16/26] object: add object_class_property_add_link()
From: |
Marc-André Lureau |
Subject: |
[PATCH 16/26] object: add object_class_property_add_link() |
Date: |
Sun, 1 Dec 2019 15:15:21 +0400 |
Signed-off-by: Marc-André Lureau <address@hidden>
---
include/qom/object.h | 9 +++++++++
qom/object.c | 46 +++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 54 insertions(+), 1 deletion(-)
diff --git a/include/qom/object.h b/include/qom/object.h
index 9bef5783f1..6cafc5f368 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -1512,6 +1512,7 @@ typedef enum {
/* private */
OBJ_PROP_LINK_DIRECT = 0x2,
+ OBJ_PROP_LINK_CLASS = 0x4,
} ObjectPropertyLinkFlags;
/**
@@ -1560,6 +1561,14 @@ void object_property_add_link(Object *obj, const char
*name,
ObjectPropertyLinkFlags flags,
Error **errp);
+ObjectProperty *object_class_property_add_link(ObjectClass *oc,
+ const char *name,
+ const char *type, ptrdiff_t offset,
+ void (*check)(const Object *obj, const char
*name,
+ Object *val, Error **errp),
+ ObjectPropertyLinkFlags flags,
+ Error **errp);
+
/**
* object_property_add_str:
* @obj: the object to add a property to
diff --git a/qom/object.c b/qom/object.c
index b73fe66dc9..9227dbc08b 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -1699,6 +1699,7 @@ typedef struct {
union {
Object **targetp;
Object *target; /* if OBJ_PROP_LINK_DIRECT, when holding the pointer
*/
+ ptrdiff_t offset; /* if OBJ_PROP_LINK_CLASS */
};
void (*check)(const Object *, const char *, Object *, Error **);
ObjectPropertyLinkFlags flags;
@@ -1709,6 +1710,8 @@ object_link_get_targetp(Object *obj, LinkProperty *lprop)
{
if (lprop->flags & OBJ_PROP_LINK_DIRECT) {
return &lprop->target;
+ } else if (lprop->flags & OBJ_PROP_LINK_CLASS) {
+ return (void *)obj + lprop->offset;
} else {
return lprop->targetp;
}
@@ -1824,7 +1827,9 @@ static void object_release_link_property(Object *obj,
const char *name,
if ((prop->flags & OBJ_PROP_LINK_STRONG) && *targetp) {
object_unref(*targetp);
}
- g_free(prop);
+ if (!(prop->flags & OBJ_PROP_LINK_CLASS)) {
+ g_free(prop);
+ }
}
static void object_add_link_prop(Object *obj, const char *name,
@@ -1877,6 +1882,45 @@ void object_property_add_link(Object *obj, const char
*name,
object_add_link_prop(obj, name, type, targetp, check, flags, errp);
}
+ObjectProperty *
+object_class_property_add_link(ObjectClass *oc,
+ const char *name,
+ const char *type, ptrdiff_t offset,
+ void (*check)(const Object *obj, const char *name,
+ Object *val, Error **errp),
+ ObjectPropertyLinkFlags flags,
+ Error **errp)
+{
+ Error *local_err = NULL;
+ LinkProperty *prop = g_new0(LinkProperty, 1);
+ gchar *full_type;
+ ObjectProperty *op;
+
+ prop->offset = offset;
+ prop->check = check;
+ prop->flags = flags | OBJ_PROP_LINK_CLASS;
+
+ full_type = g_strdup_printf("link<%s>", type);
+
+ op = object_class_property_add(oc, name, full_type,
+ object_get_link_property,
+ check ? object_set_link_property : NULL,
+ object_release_link_property,
+ prop,
+ &local_err);
+ if (local_err) {
+ error_propagate(errp, local_err);
+ g_free(prop);
+ goto out;
+ }
+
+ op->resolve = object_resolve_link_property;
+
+out:
+ g_free(full_type);
+ return op;
+}
+
void object_property_add_const_link(Object *obj, const char *name,
Object *target, Error **errp)
{
--
2.24.0
- [PATCH 06/26] object: add class property initializer, (continued)
- [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, 2019/12/01
- [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 <=
- [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
- [PATCH 25/26] qapi/qmp: add ObjectPropertyInfo.default-value, Marc-André Lureau, 2019/12/01