qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v2 3/5] qom: object_child_foreach_recursive_type()


From: David Hildenbrand
Subject: Re: [PATCH v2 3/5] qom: object_child_foreach_recursive_type()
Date: Thu, 28 Oct 2021 09:06:29 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.1.0

On 28.10.21 06:31, Peter Xu wrote:
> Add this sister helper besides object_child_foreach_recursive() to loop over
> child objects only if the object can be casted to a specific type.
> 
> Suggested-by: Michael S. Tsirkin <mst@redhat.com>
> Signed-off-by: Peter Xu <peterx@redhat.com>
> ---
>  include/qom/object.h | 20 ++++++++++++++++++++
>  qom/object.c         | 27 +++++++++++++++++++++++++++
>  2 files changed, 47 insertions(+)
> 
> diff --git a/include/qom/object.h b/include/qom/object.h
> index faae0d841f..355277db40 100644
> --- a/include/qom/object.h
> +++ b/include/qom/object.h
> @@ -1926,6 +1926,26 @@ int object_child_foreach(Object *obj, int (*fn)(Object 
> *child, void *opaque),
>  int object_child_foreach_recursive(Object *obj,
>                                     int (*fn)(Object *child, void *opaque),
>                                     void *opaque);
> +
> +/**
> + * object_child_foreach_recursive_type:
> + * @obj: the object whose children will be navigated
> + * @type: the typename string to scan
> + * @fn: the iterator function to be called
> + * @opaque: an opaque value that will be passed to the iterator
> + *
> + * This is a special version of object_child_foreach_recursive() so that we
> + * only call the fn() if the child can be casted to the @typename specified.
> + * Please refer to the comments above object_child_foreach_recursive() for
> + * more details.
> + *
> + * Returns: The last value returned by @fn, or 0 if there is no child.
> + */
> +int object_child_foreach_recursive_type(Object *obj,
> +                                        const char *typename,
> +                                        int (*fn)(Object *child, void 
> *opaque),
> +                                        void *opaque);
> +
>  /**
>   * container_get:
>   * @root: root of the #path, e.g., object_get_root()
> diff --git a/qom/object.c b/qom/object.c
> index 6be710bc40..d25ca09b1d 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -1134,6 +1134,33 @@ int object_child_foreach_recursive(Object *obj,
>      return do_object_child_foreach(obj, fn, opaque, true);
>  }
>  
> +typedef struct {
> +    const char *typename;
> +    int (*fn)(Object *child, void *opaque);
> +    void *opaque;
> +} ObjectTypeArgs;
> +
> +static int object_child_hook(Object *child, void *opaque)
> +{
> +    ObjectTypeArgs *args = opaque;
> +
> +    if (object_dynamic_cast(child, args->typename)) {
> +        return args->fn(child, args->opaque);
> +    }
> +
> +    return 0;
> +}
> +
> +int object_child_foreach_recursive_type(Object *obj,
> +                                        const char *typename,
> +                                        int (*fn)(Object *child, void 
> *opaque),
> +                                        void *opaque)
> +{
> +    ObjectTypeArgs args = { .typename = typename, .fn = fn, .opaque = opaque 
> };
> +
> +    return object_child_foreach_recursive(obj, object_child_hook, &args);
> +}
> +
>  static void object_class_get_list_tramp(ObjectClass *klass, void *opaque)
>  {
>      GSList **list = opaque;
> 

Reviewed-by: David Hildenbrand <david@redhat.com>

-- 
Thanks,

David / dhildenb




reply via email to

[Prev in Thread] Current Thread [Next in Thread]