mirror of https://github.com/xemu-project/xemu.git
qom: add object_property_add_alias()
Sometimes an object needs to present a property which is actually on another object, or it needs to provide an alias name for an existing property. Examples: a.foo -> b.foo a.old_name -> a.new_name The new object_property_add_alias() API allows objects to alias a property on the same object or another object. The source and target names can be different. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
This commit is contained in:
parent
53a259da56
commit
ef7c7ff6d4
|
@ -1230,6 +1230,26 @@ void object_property_add_uint32_ptr(Object *obj, const char *name,
|
||||||
void object_property_add_uint64_ptr(Object *obj, const char *name,
|
void object_property_add_uint64_ptr(Object *obj, const char *name,
|
||||||
const uint64_t *v, Error **Errp);
|
const uint64_t *v, Error **Errp);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* object_property_add_alias:
|
||||||
|
* @obj: the object to add a property to
|
||||||
|
* @name: the name of the property
|
||||||
|
* @target_obj: the object to forward property access to
|
||||||
|
* @target_name: the name of the property on the forwarded object
|
||||||
|
* @errp: if an error occurs, a pointer to an area to store the error
|
||||||
|
*
|
||||||
|
* Add an alias for a property on an object. This function will add a property
|
||||||
|
* of the same type as the forwarded property.
|
||||||
|
*
|
||||||
|
* The caller must ensure that <code>@target_obj</code> stays alive as long as
|
||||||
|
* this property exists. In the case of a child object or an alias on the same
|
||||||
|
* object this will be the case. For aliases to other objects the caller is
|
||||||
|
* responsible for taking a reference.
|
||||||
|
*/
|
||||||
|
void object_property_add_alias(Object *obj, const char *name,
|
||||||
|
Object *target_obj, const char *target_name,
|
||||||
|
Error **errp);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* object_child_foreach:
|
* object_child_foreach:
|
||||||
* @obj: the object whose children will be navigated
|
* @obj: the object whose children will be navigated
|
||||||
|
|
51
qom/object.c
51
qom/object.c
|
@ -1550,6 +1550,57 @@ void object_property_add_uint64_ptr(Object *obj, const char *name,
|
||||||
NULL, NULL, (void *)v, errp);
|
NULL, NULL, (void *)v, errp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
Object *target_obj;
|
||||||
|
const char *target_name;
|
||||||
|
} AliasProperty;
|
||||||
|
|
||||||
|
static void property_get_alias(Object *obj, struct Visitor *v, void *opaque,
|
||||||
|
const char *name, Error **errp)
|
||||||
|
{
|
||||||
|
AliasProperty *prop = opaque;
|
||||||
|
|
||||||
|
object_property_get(prop->target_obj, v, prop->target_name, errp);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void property_set_alias(Object *obj, struct Visitor *v, void *opaque,
|
||||||
|
const char *name, Error **errp)
|
||||||
|
{
|
||||||
|
AliasProperty *prop = opaque;
|
||||||
|
|
||||||
|
object_property_set(prop->target_obj, v, prop->target_name, errp);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void property_release_alias(Object *obj, const char *name, void *opaque)
|
||||||
|
{
|
||||||
|
AliasProperty *prop = opaque;
|
||||||
|
|
||||||
|
g_free(prop);
|
||||||
|
}
|
||||||
|
|
||||||
|
void object_property_add_alias(Object *obj, const char *name,
|
||||||
|
Object *target_obj, const char *target_name,
|
||||||
|
Error **errp)
|
||||||
|
{
|
||||||
|
AliasProperty *prop;
|
||||||
|
ObjectProperty *target_prop;
|
||||||
|
|
||||||
|
target_prop = object_property_find(target_obj, target_name, errp);
|
||||||
|
if (!target_prop) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
prop = g_malloc(sizeof(*prop));
|
||||||
|
prop->target_obj = target_obj;
|
||||||
|
prop->target_name = target_name;
|
||||||
|
|
||||||
|
object_property_add(obj, name, target_prop->type,
|
||||||
|
property_get_alias,
|
||||||
|
property_set_alias,
|
||||||
|
property_release_alias,
|
||||||
|
prop, errp);
|
||||||
|
}
|
||||||
|
|
||||||
static void object_instance_init(Object *obj)
|
static void object_instance_init(Object *obj)
|
||||||
{
|
{
|
||||||
object_property_add_str(obj, "type", qdev_get_type, NULL, NULL);
|
object_property_add_str(obj, "type", qdev_get_type, NULL, NULL);
|
||||||
|
|
Loading…
Reference in New Issue