mirror of
https://github.com/qemu/qemu.git
synced 2025-08-09 10:25:06 +00:00
object: add object_class_property_add_link()
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-Id: <20200110153039.1379601-17-marcandre.lureau@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
4a8d57989b
commit
840ecdfbf9
@ -1514,6 +1514,7 @@ typedef enum {
|
|||||||
|
|
||||||
/* private */
|
/* private */
|
||||||
OBJ_PROP_LINK_DIRECT = 0x2,
|
OBJ_PROP_LINK_DIRECT = 0x2,
|
||||||
|
OBJ_PROP_LINK_CLASS = 0x4,
|
||||||
} ObjectPropertyLinkFlags;
|
} ObjectPropertyLinkFlags;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1562,6 +1563,14 @@ void object_property_add_link(Object *obj, const char *name,
|
|||||||
ObjectPropertyLinkFlags flags,
|
ObjectPropertyLinkFlags flags,
|
||||||
Error **errp);
|
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:
|
* object_property_add_str:
|
||||||
* @obj: the object to add a property to
|
* @obj: the object to add a property to
|
||||||
|
44
qom/object.c
44
qom/object.c
@ -1716,6 +1716,7 @@ typedef struct {
|
|||||||
union {
|
union {
|
||||||
Object **targetp;
|
Object **targetp;
|
||||||
Object *target; /* if OBJ_PROP_LINK_DIRECT, when holding the pointer */
|
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 **);
|
void (*check)(const Object *, const char *, Object *, Error **);
|
||||||
ObjectPropertyLinkFlags flags;
|
ObjectPropertyLinkFlags flags;
|
||||||
@ -1726,6 +1727,8 @@ object_link_get_targetp(Object *obj, LinkProperty *lprop)
|
|||||||
{
|
{
|
||||||
if (lprop->flags & OBJ_PROP_LINK_DIRECT) {
|
if (lprop->flags & OBJ_PROP_LINK_DIRECT) {
|
||||||
return &lprop->target;
|
return &lprop->target;
|
||||||
|
} else if (lprop->flags & OBJ_PROP_LINK_CLASS) {
|
||||||
|
return (void *)obj + lprop->offset;
|
||||||
} else {
|
} else {
|
||||||
return lprop->targetp;
|
return lprop->targetp;
|
||||||
}
|
}
|
||||||
@ -1841,8 +1844,10 @@ static void object_release_link_property(Object *obj, const char *name,
|
|||||||
if ((prop->flags & OBJ_PROP_LINK_STRONG) && *targetp) {
|
if ((prop->flags & OBJ_PROP_LINK_STRONG) && *targetp) {
|
||||||
object_unref(*targetp);
|
object_unref(*targetp);
|
||||||
}
|
}
|
||||||
|
if (!(prop->flags & OBJ_PROP_LINK_CLASS)) {
|
||||||
g_free(prop);
|
g_free(prop);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void object_add_link_prop(Object *obj, const char *name,
|
static void object_add_link_prop(Object *obj, const char *name,
|
||||||
const char *type, void *ptr,
|
const char *type, void *ptr,
|
||||||
@ -1894,6 +1899,45 @@ void object_property_add_link(Object *obj, const char *name,
|
|||||||
object_add_link_prop(obj, name, type, targetp, check, flags, errp);
|
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,
|
void object_property_add_const_link(Object *obj, const char *name,
|
||||||
Object *target, Error **errp)
|
Object *target, Error **errp)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user