object: express const link with link property

Let's not mix child property and link property callbacks, as this is
confusing, use LinkProperty with DIRECT flag to hold the target pointer.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20200110153039.1379601-16-marcandre.lureau@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Marc-André Lureau 2020-01-10 19:30:28 +04:00 committed by Paolo Bonzini
parent 9941d37b4d
commit 4a8d57989b
1 changed files with 23 additions and 18 deletions

View File

@ -1844,19 +1844,23 @@ static void object_release_link_property(Object *obj, const char *name,
g_free(prop); g_free(prop);
} }
void object_property_add_link(Object *obj, const char *name, static void object_add_link_prop(Object *obj, const char *name,
const char *type, Object **targetp, const char *type, void *ptr,
void (*check)(const Object *, const char *, void (*check)(const Object *, const char *,
Object *, Error **), Object *, Error **),
ObjectPropertyLinkFlags flags, ObjectPropertyLinkFlags flags,
Error **errp) Error **errp)
{ {
Error *local_err = NULL; Error *local_err = NULL;
LinkProperty *prop = g_malloc(sizeof(*prop)); LinkProperty *prop = g_malloc(sizeof(*prop));
gchar *full_type; gchar *full_type;
ObjectProperty *op; ObjectProperty *op;
prop->targetp = targetp; if (flags & OBJ_PROP_LINK_DIRECT) {
prop->target = ptr;
} else {
prop->targetp = ptr;
}
prop->check = check; prop->check = check;
prop->flags = flags; prop->flags = flags;
@ -1880,20 +1884,21 @@ out:
g_free(full_type); g_free(full_type);
} }
void object_property_add_link(Object *obj, const char *name,
const char *type, Object **targetp,
void (*check)(const Object *, const char *,
Object *, Error **),
ObjectPropertyLinkFlags flags,
Error **errp)
{
object_add_link_prop(obj, name, type, targetp, check, flags, errp);
}
void object_property_add_const_link(Object *obj, const char *name, void object_property_add_const_link(Object *obj, const char *name,
Object *target, Error **errp) Object *target, Error **errp)
{ {
char *link_type; object_add_link_prop(obj, name, object_get_typename(target), target,
ObjectProperty *op; NULL, OBJ_PROP_LINK_DIRECT, errp);
link_type = g_strdup_printf("link<%s>", object_get_typename(target));
op = object_property_add(obj, name, link_type,
object_get_child_property, NULL,
NULL, target, errp);
if (op != NULL) {
op->resolve = object_resolve_child_property;
}
g_free(link_type);
} }
gchar *object_get_canonical_path_component(Object *obj) gchar *object_get_canonical_path_component(Object *obj)