mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-27 05:20:50 +00:00
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,
|
||||
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:
|
||||
* @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);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
object_property_add_str(obj, "type", qdev_get_type, NULL, NULL);
|
||||
|
Loading…
Reference in New Issue
Block a user