[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 2/3] qdev: check callback takes Object **target
From: |
Paolo Bonzini |
Subject: |
Re: [Qemu-devel] [PATCH 2/3] qdev: check callback takes Object **target as third argument |
Date: |
Tue, 28 Apr 2015 13:47:33 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.5.0 |
On 28/04/2015 11:18, Eric Auger wrote:
> Check callback now takes as third argument an Object **. In
> object_set_link_property, we pass the property child as argument.
> We also assign the *child before the check call so that enhanced
> check can be performed in the callback. In case the check fails,
> the old value is restored and ref count is left unchanged.
>
> This typically makes possible to do checks both on the *child
> content (for instance a qemu_irq) and also perform some actions/
> checks on its container, which was not possible before.
>
> This is typically useful for starting irqfd setup in vfio platform
> use case.
s/typically/for example/
I can't say that "starting irqfd setup in vfio platform" is typical. :)
> diff --git a/include/qom/object.h b/include/qom/object.h
> index 4687fa1..0a7daff 100644
> --- a/include/qom/object.h
> +++ b/include/qom/object.h
> @@ -34,7 +34,7 @@ typedef struct InterfaceClass InterfaceClass;
> typedef struct InterfaceInfo InterfaceInfo;
>
> typedef void (*object_property_set_link_t)(Object *, const char *,
> - Object *, Error **);
> + Object **, Error **);
Let's make the new argument "Object * const*", and rename the typedef to
LinkPropertySetter.
Ok with that change.
Paolo
>
> #define TYPE_OBJECT "object"
>
> @@ -1136,7 +1136,7 @@ typedef enum {
> * an error.
> */
> void object_property_allow_set_link(Object *, const char *,
> - Object *, Error **);
> + Object **, Error **);
>
> /**
> * object_property_add_link:
> @@ -1168,8 +1168,7 @@ void object_property_allow_set_link(Object *, const
> char *,
> */
> void object_property_add_link(Object *obj, const char *name,
> const char *type, Object **child,
> - void (*check)(Object *obj, const char *name,
> - Object *val, Error **errp),
> + object_property_set_link_t check,
> ObjectPropertyLinkFlags flags,
> Error **errp);
>
> diff --git a/qom/object.c b/qom/object.c
> index b8dff43..cc9ed87 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -1112,14 +1112,14 @@ out:
> }
>
> void object_property_allow_set_link(Object *obj, const char *name,
> - Object *val, Error **errp)
> + Object **target, Error **errp)
> {
> /* Allow the link to be set, always */
> }
>
> typedef struct {
> Object **child;
> - void (*check)(Object *, const char *, Object *, Error **);
> + void (*check)(Object *, const char *, Object **, Error **);
> ObjectPropertyLinkFlags flags;
> } LinkProperty;
>
> @@ -1201,14 +1201,17 @@ static void object_set_link_property(Object *obj,
> Visitor *v, void *opaque,
> return;
> }
>
> - prop->check(obj, name, new_target, &local_err);
> + object_ref(new_target);
> + *child = new_target;
> +
> + prop->check(obj, name, child, &local_err);
> if (local_err) {
> error_propagate(errp, local_err);
> + *child = old_target;
> + object_ref(new_target);
> return;
> }
>
> - object_ref(new_target);
> - *child = new_target;
> object_unref(old_target);
> }
>
> @@ -1233,7 +1236,7 @@ static void object_release_link_property(Object *obj,
> const char *name,
> void object_property_add_link(Object *obj, const char *name,
> const char *type, Object **child,
> void (*check)(Object *, const char *,
> - Object *, Error **),
> + Object **, Error **),
> ObjectPropertyLinkFlags flags,
> Error **errp)
> {
>