Patchwork [v2] qom: Introduce object_class_get_list()

login
register
mail settings
Submitter Andreas Färber
Date Feb. 25, 2012, 10:07 p.m.
Message ID <1330207654-25841-1-git-send-email-afaerber@suse.de>
Download mbox | patch
Permalink /patch/143076/
State New
Headers show

Comments

Andreas Färber - Feb. 25, 2012, 10:07 p.m.
This function allows to obtain a singly-linked list of classes, which
can be sorted by the caller.

Signed-off-by: Andreas Färber <afaerber@suse.de>
Cc: Anthony Liguori <anthony@codemonkey.ws>
---
 v1 -> v2:
 * Instead of object_class_foreach() using a GCompareFunc with a GTree internally,
   return a GSList so that the caller can sort herself (suggested by Anthony).
 * Add documentation.

 include/qemu/object.h |   11 +++++++++++
 qom/object.c          |   17 +++++++++++++++++
 2 files changed, 28 insertions(+), 0 deletions(-)
Andreas Färber - Feb. 25, 2012, 10:10 p.m.
Am 25.02.2012 23:07, schrieb Andreas Färber:
> This function allows to obtain a singly-linked list of classes, which
> can be sorted by the caller.
> 
> Signed-off-by: Andreas Färber <afaerber@suse.de>
> Cc: Anthony Liguori <anthony@codemonkey.ws>
> ---
>  v1 -> v2:
>  * Instead of object_class_foreach() using a GCompareFunc with a GTree internally,

Err, should've been object_class_foreach_ordered();
object_class_foreach() does continue to exist. ;)

Andreas

>    return a GSList so that the caller can sort herself (suggested by Anthony).
>  * Add documentation.
> 
>  include/qemu/object.h |   11 +++++++++++
>  qom/object.c          |   17 +++++++++++++++++
>  2 files changed, 28 insertions(+), 0 deletions(-)
> 
> diff --git a/include/qemu/object.h b/include/qemu/object.h
> index 69e4b7b..ddc3b81 100644
> --- a/include/qemu/object.h
> +++ b/include/qemu/object.h
> @@ -560,6 +560,17 @@ ObjectClass *object_class_by_name(const char *typename);
>  void object_class_foreach(void (*fn)(ObjectClass *klass, void *opaque),
>                            const char *implements_type, bool include_abstract,
>                            void *opaque);
> +
> +/**
> + * object_class_get_list:
> + * @implements_type: The type to filter for, including its derivatives.
> + * @include_abstract: Whether to include abstract classes.
> + *
> + * Returns: A singly-linked list of the classes in reverse hashtable order.
> + */
> +GSList *object_class_get_list(const char *implements_type,
> +                              bool include_abstract);
> +
>  /**
>   * object_ref:
>   * @obj: the object
> diff --git a/qom/object.c b/qom/object.c
> index aa037d2..eef0b22 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -572,6 +572,23 @@ void object_class_foreach(void (*fn)(ObjectClass *klass, void *opaque),
>      g_hash_table_foreach(type_table_get(), object_class_foreach_tramp, &data);
>  }
>  
> +static void object_class_get_list_tramp(ObjectClass *klass, void *opaque)
> +{
> +    GSList **list = opaque;
> +
> +    *list = g_slist_prepend(*list, klass);
> +}
> +
> +GSList *object_class_get_list(const char *implements_type,
> +                              bool include_abstract)
> +{
> +    GSList *list = NULL;
> +
> +    object_class_foreach(object_class_get_list_tramp,
> +                         implements_type, include_abstract, &list);
> +    return list;
> +}
> +
>  void object_ref(Object *obj)
>  {
>      obj->ref++;
Andreas Färber - March 7, 2012, 10:21 a.m.
Am 25.02.2012 23:07, schrieb Andreas Färber:
> This function allows to obtain a singly-linked list of classes, which
> can be sorted by the caller.
> 
> Signed-off-by: Andreas Färber <afaerber@suse.de>
> Cc: Anthony Liguori <anthony@codemonkey.ws>

Ping? You requested me to do it via GSList instead of GTree, and the
qom-cpu branch has been successfully rebased onto it.

Andreas

> ---
>  v1 -> v2:
>  * Instead of [object_class_foreach_ordered()] using a GCompareFunc with a GTree internally,
>    return a GSList so that the caller can sort herself (suggested by Anthony).
>  * Add documentation.
> 
>  include/qemu/object.h |   11 +++++++++++
>  qom/object.c          |   17 +++++++++++++++++
>  2 files changed, 28 insertions(+), 0 deletions(-)
> 
> diff --git a/include/qemu/object.h b/include/qemu/object.h
> index 69e4b7b..ddc3b81 100644
> --- a/include/qemu/object.h
> +++ b/include/qemu/object.h
> @@ -560,6 +560,17 @@ ObjectClass *object_class_by_name(const char *typename);
>  void object_class_foreach(void (*fn)(ObjectClass *klass, void *opaque),
>                            const char *implements_type, bool include_abstract,
>                            void *opaque);
> +
> +/**
> + * object_class_get_list:
> + * @implements_type: The type to filter for, including its derivatives.
> + * @include_abstract: Whether to include abstract classes.
> + *
> + * Returns: A singly-linked list of the classes in reverse hashtable order.
> + */
> +GSList *object_class_get_list(const char *implements_type,
> +                              bool include_abstract);
> +
>  /**
>   * object_ref:
>   * @obj: the object
> diff --git a/qom/object.c b/qom/object.c
> index aa037d2..eef0b22 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -572,6 +572,23 @@ void object_class_foreach(void (*fn)(ObjectClass *klass, void *opaque),
>      g_hash_table_foreach(type_table_get(), object_class_foreach_tramp, &data);
>  }
>  
> +static void object_class_get_list_tramp(ObjectClass *klass, void *opaque)
> +{
> +    GSList **list = opaque;
> +
> +    *list = g_slist_prepend(*list, klass);
> +}
> +
> +GSList *object_class_get_list(const char *implements_type,
> +                              bool include_abstract)
> +{
> +    GSList *list = NULL;
> +
> +    object_class_foreach(object_class_get_list_tramp,
> +                         implements_type, include_abstract, &list);
> +    return list;
> +}
> +
>  void object_ref(Object *obj)
>  {
>      obj->ref++;
Andreas Färber - March 10, 2012, 1:29 a.m.
Am 07.03.2012 11:21, schrieb Andreas Färber:
> Am 25.02.2012 23:07, schrieb Andreas Färber:
>> This function allows to obtain a singly-linked list of classes, which
>> can be sorted by the caller.
>>
>> Signed-off-by: Andreas Färber <afaerber@suse.de>
>> Cc: Anthony Liguori <anthony@codemonkey.ws>
> 
> Ping? You requested me to do it via GSList instead of GTree, and the
> qom-cpu branch has been successfully rebased onto it.

Ping^2! Anthony, is this in your queue or do you want a PULL?

Andreas

>> ---
>>  v1 -> v2:
>>  * Instead of [object_class_foreach_ordered()] using a GCompareFunc with a GTree internally,
>>    return a GSList so that the caller can sort herself (suggested by Anthony).
>>  * Add documentation.
>>
>>  include/qemu/object.h |   11 +++++++++++
>>  qom/object.c          |   17 +++++++++++++++++
>>  2 files changed, 28 insertions(+), 0 deletions(-)
>>
>> diff --git a/include/qemu/object.h b/include/qemu/object.h
>> index 69e4b7b..ddc3b81 100644
>> --- a/include/qemu/object.h
>> +++ b/include/qemu/object.h
>> @@ -560,6 +560,17 @@ ObjectClass *object_class_by_name(const char *typename);
>>  void object_class_foreach(void (*fn)(ObjectClass *klass, void *opaque),
>>                            const char *implements_type, bool include_abstract,
>>                            void *opaque);
>> +
>> +/**
>> + * object_class_get_list:
>> + * @implements_type: The type to filter for, including its derivatives.
>> + * @include_abstract: Whether to include abstract classes.
>> + *
>> + * Returns: A singly-linked list of the classes in reverse hashtable order.
>> + */
>> +GSList *object_class_get_list(const char *implements_type,
>> +                              bool include_abstract);
>> +
>>  /**
>>   * object_ref:
>>   * @obj: the object
>> diff --git a/qom/object.c b/qom/object.c
>> index aa037d2..eef0b22 100644
>> --- a/qom/object.c
>> +++ b/qom/object.c
>> @@ -572,6 +572,23 @@ void object_class_foreach(void (*fn)(ObjectClass *klass, void *opaque),
>>      g_hash_table_foreach(type_table_get(), object_class_foreach_tramp, &data);
>>  }
>>  
>> +static void object_class_get_list_tramp(ObjectClass *klass, void *opaque)
>> +{
>> +    GSList **list = opaque;
>> +
>> +    *list = g_slist_prepend(*list, klass);
>> +}
>> +
>> +GSList *object_class_get_list(const char *implements_type,
>> +                              bool include_abstract)
>> +{
>> +    GSList *list = NULL;
>> +
>> +    object_class_foreach(object_class_get_list_tramp,
>> +                         implements_type, include_abstract, &list);
>> +    return list;
>> +}
>> +
>>  void object_ref(Object *obj)
>>  {
>>      obj->ref++;
>
Anthony Liguori - March 14, 2012, 9:18 p.m.
On 02/25/2012 04:07 PM, Andreas Färber wrote:
> This function allows to obtain a singly-linked list of classes, which
> can be sorted by the caller.
>
> Signed-off-by: Andreas Färber<afaerber@suse.de>
> Cc: Anthony Liguori<anthony@codemonkey.ws>

Applied.  Thanks.

Regards,

Anthony Liguori

> ---
>   v1 ->  v2:
>   * Instead of object_class_foreach() using a GCompareFunc with a GTree internally,
>     return a GSList so that the caller can sort herself (suggested by Anthony).
>   * Add documentation.
>
>   include/qemu/object.h |   11 +++++++++++
>   qom/object.c          |   17 +++++++++++++++++
>   2 files changed, 28 insertions(+), 0 deletions(-)
>
> diff --git a/include/qemu/object.h b/include/qemu/object.h
> index 69e4b7b..ddc3b81 100644
> --- a/include/qemu/object.h
> +++ b/include/qemu/object.h
> @@ -560,6 +560,17 @@ ObjectClass *object_class_by_name(const char *typename);
>   void object_class_foreach(void (*fn)(ObjectClass *klass, void *opaque),
>                             const char *implements_type, bool include_abstract,
>                             void *opaque);
> +
> +/**
> + * object_class_get_list:
> + * @implements_type: The type to filter for, including its derivatives.
> + * @include_abstract: Whether to include abstract classes.
> + *
> + * Returns: A singly-linked list of the classes in reverse hashtable order.
> + */
> +GSList *object_class_get_list(const char *implements_type,
> +                              bool include_abstract);
> +
>   /**
>    * object_ref:
>    * @obj: the object
> diff --git a/qom/object.c b/qom/object.c
> index aa037d2..eef0b22 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -572,6 +572,23 @@ void object_class_foreach(void (*fn)(ObjectClass *klass, void *opaque),
>       g_hash_table_foreach(type_table_get(), object_class_foreach_tramp,&data);
>   }
>
> +static void object_class_get_list_tramp(ObjectClass *klass, void *opaque)
> +{
> +    GSList **list = opaque;
> +
> +    *list = g_slist_prepend(*list, klass);
> +}
> +
> +GSList *object_class_get_list(const char *implements_type,
> +                              bool include_abstract)
> +{
> +    GSList *list = NULL;
> +
> +    object_class_foreach(object_class_get_list_tramp,
> +                         implements_type, include_abstract,&list);
> +    return list;
> +}
> +
>   void object_ref(Object *obj)
>   {
>       obj->ref++;

Patch

diff --git a/include/qemu/object.h b/include/qemu/object.h
index 69e4b7b..ddc3b81 100644
--- a/include/qemu/object.h
+++ b/include/qemu/object.h
@@ -560,6 +560,17 @@  ObjectClass *object_class_by_name(const char *typename);
 void object_class_foreach(void (*fn)(ObjectClass *klass, void *opaque),
                           const char *implements_type, bool include_abstract,
                           void *opaque);
+
+/**
+ * object_class_get_list:
+ * @implements_type: The type to filter for, including its derivatives.
+ * @include_abstract: Whether to include abstract classes.
+ *
+ * Returns: A singly-linked list of the classes in reverse hashtable order.
+ */
+GSList *object_class_get_list(const char *implements_type,
+                              bool include_abstract);
+
 /**
  * object_ref:
  * @obj: the object
diff --git a/qom/object.c b/qom/object.c
index aa037d2..eef0b22 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -572,6 +572,23 @@  void object_class_foreach(void (*fn)(ObjectClass *klass, void *opaque),
     g_hash_table_foreach(type_table_get(), object_class_foreach_tramp, &data);
 }
 
+static void object_class_get_list_tramp(ObjectClass *klass, void *opaque)
+{
+    GSList **list = opaque;
+
+    *list = g_slist_prepend(*list, klass);
+}
+
+GSList *object_class_get_list(const char *implements_type,
+                              bool include_abstract)
+{
+    GSList *list = NULL;
+
+    object_class_foreach(object_class_get_list_tramp,
+                         implements_type, include_abstract, &list);
+    return list;
+}
+
 void object_ref(Object *obj)
 {
     obj->ref++;