Re: [Qemu-devel] [PATCH 1/3] qom: introduce object_class_get_list_sorted

2018-03-08 Thread Thomas Huth
On 08.03.2018 18:28, Paolo Bonzini wrote:
> Unify half a dozen copies of very similar code (the only difference being
> whether comparisons were case-sensitive) and use it also in Tricore,
> which did not do any sorting of CPU model names.
> 
> Signed-off-by: Paolo Bonzini 
> ---
>  include/qom/object.h| 11 +++
>  qdev-monitor.c  |  9 +
>  qom/object.c| 13 +
>  target/alpha/cpu.c  | 15 +--
>  target/hppa/cpu.c   | 15 +--
>  target/lm32/cpu.c   | 15 +--
>  target/sh4/cpu.c| 15 +--
>  target/tricore/helper.c |  2 +-
>  8 files changed, 30 insertions(+), 65 deletions(-)

Reviewed-by: Thomas Huth 




Re: [Qemu-devel] [PATCH 1/3] qom: introduce object_class_get_list_sorted

2018-03-08 Thread Philippe Mathieu-Daudé
On 03/08/2018 02:28 PM, Paolo Bonzini wrote:
> Unify half a dozen copies of very similar code (the only difference being
> whether comparisons were case-sensitive) and use it also in Tricore,
> which did not do any sorting of CPU model names.
> 
> Signed-off-by: Paolo Bonzini 

Reviewed-by: Philippe Mathieu-Daudé 

> ---
>  include/qom/object.h| 11 +++
>  qdev-monitor.c  |  9 +
>  qom/object.c| 13 +
>  target/alpha/cpu.c  | 15 +--
>  target/hppa/cpu.c   | 15 +--
>  target/lm32/cpu.c   | 15 +--
>  target/sh4/cpu.c| 15 +--
>  target/tricore/helper.c |  2 +-
>  8 files changed, 30 insertions(+), 65 deletions(-)
> 
> diff --git a/include/qom/object.h b/include/qom/object.h
> index 4f07090db0..96ce81bc5e 100644
> --- a/include/qom/object.h
> +++ b/include/qom/object.h
> @@ -913,6 +913,17 @@ void object_class_foreach(void (*fn)(ObjectClass *klass, 
> void *opaque),
>  GSList *object_class_get_list(const char *implements_type,
>bool include_abstract);
>  
> +/**
> + * object_class_get_list_sorted:
> + * @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 alphabetical
> + * case-insensitive order.
> + */
> +GSList *object_class_get_list_sorted(const char *implements_type,
> +  bool include_abstract);
> +
>  /**
>   * object_ref:
>   * @obj: the object
> diff --git a/qdev-monitor.c b/qdev-monitor.c
> index b7e3291f8b..61e0300991 100644
> --- a/qdev-monitor.c
> +++ b/qdev-monitor.c
> @@ -122,12 +122,6 @@ static void qdev_print_devinfo(DeviceClass *dc)
>  error_printf("\n");
>  }
>  
> -static gint devinfo_cmp(gconstpointer a, gconstpointer b)
> -{
> -return strcasecmp(object_class_get_name((ObjectClass *)a),
> -  object_class_get_name((ObjectClass *)b));
> -}
> -
>  static void qdev_print_devinfos(bool show_no_user)
>  {
>  static const char *cat_name[DEVICE_CATEGORY_MAX + 1] = {
> @@ -146,8 +140,7 @@ static void qdev_print_devinfos(bool show_no_user)
>  int i;
>  bool cat_printed;
>  
> -list = g_slist_sort(object_class_get_list(TYPE_DEVICE, false),
> -devinfo_cmp);
> +list = object_class_get_list_sorted(TYPE_DEVICE, false);
>  
>  for (i = 0; i <= DEVICE_CATEGORY_MAX; i++) {
>  cat_printed = false;
> diff --git a/qom/object.c b/qom/object.c
> index 755ad03819..6088f55943 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -891,6 +891,19 @@ GSList *object_class_get_list(const char 
> *implements_type,
>  return list;
>  }
>  
> +static gint object_class_cmp(gconstpointer a, gconstpointer b)
> +{
> +return strcasecmp(object_class_get_name((ObjectClass *)a),
> +  object_class_get_name((ObjectClass *)b));
> +}
> +
> +GSList *object_class_get_list_sorted(const char *implements_type,
> + bool include_abstract)
> +{
> +return g_slist_sort(object_class_get_list(implements_type, 
> include_abstract),
> +object_class_cmp);
> +}
> +
>  void object_ref(Object *obj)
>  {
>  if (!obj) {
> diff --git a/target/alpha/cpu.c b/target/alpha/cpu.c
> index 55675ce419..b08078e7fc 100644
> --- a/target/alpha/cpu.c
> +++ b/target/alpha/cpu.c
> @@ -71,18 +71,6 @@ static void alpha_cpu_realizefn(DeviceState *dev, Error 
> **errp)
>  acc->parent_realize(dev, errp);
>  }
>  
> -/* Sort alphabetically by type name. */
> -static gint alpha_cpu_list_compare(gconstpointer a, gconstpointer b)
> -{
> -ObjectClass *class_a = (ObjectClass *)a;
> -ObjectClass *class_b = (ObjectClass *)b;
> -const char *name_a, *name_b;
> -
> -name_a = object_class_get_name(class_a);
> -name_b = object_class_get_name(class_b);
> -return strcmp(name_a, name_b);
> -}
> -
>  static void alpha_cpu_list_entry(gpointer data, gpointer user_data)
>  {
>  ObjectClass *oc = data;
> @@ -100,8 +88,7 @@ void alpha_cpu_list(FILE *f, fprintf_function cpu_fprintf)
>  };
>  GSList *list;
>  
> -list = object_class_get_list(TYPE_ALPHA_CPU, false);
> -list = g_slist_sort(list, alpha_cpu_list_compare);
> +list = object_class_get_list_sorted(TYPE_ALPHA_CPU, false);
>  (*cpu_fprintf)(f, "Available CPUs:\n");
>  g_slist_foreach(list, alpha_cpu_list_entry, );
>  g_slist_free(list);
> diff --git a/target/hppa/cpu.c b/target/hppa/cpu.c
> index 969f628f0a..c261b6b090 100644
> --- a/target/hppa/cpu.c
> +++ b/target/hppa/cpu.c
> @@ -110,18 +110,6 @@ static void hppa_cpu_realizefn(DeviceState *dev, Error 
> **errp)
>  #endif
>  }
>  
> -/* Sort hppabetically by type name. */
> -static gint hppa_cpu_list_compare(gconstpointer a, gconstpointer b)
> -{
> -ObjectClass *class_a = (ObjectClass *)a;
> -

[Qemu-devel] [PATCH 1/3] qom: introduce object_class_get_list_sorted

2018-03-08 Thread Paolo Bonzini
Unify half a dozen copies of very similar code (the only difference being
whether comparisons were case-sensitive) and use it also in Tricore,
which did not do any sorting of CPU model names.

Signed-off-by: Paolo Bonzini 
---
 include/qom/object.h| 11 +++
 qdev-monitor.c  |  9 +
 qom/object.c| 13 +
 target/alpha/cpu.c  | 15 +--
 target/hppa/cpu.c   | 15 +--
 target/lm32/cpu.c   | 15 +--
 target/sh4/cpu.c| 15 +--
 target/tricore/helper.c |  2 +-
 8 files changed, 30 insertions(+), 65 deletions(-)

diff --git a/include/qom/object.h b/include/qom/object.h
index 4f07090db0..96ce81bc5e 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -913,6 +913,17 @@ void object_class_foreach(void (*fn)(ObjectClass *klass, 
void *opaque),
 GSList *object_class_get_list(const char *implements_type,
   bool include_abstract);
 
+/**
+ * object_class_get_list_sorted:
+ * @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 alphabetical
+ * case-insensitive order.
+ */
+GSList *object_class_get_list_sorted(const char *implements_type,
+  bool include_abstract);
+
 /**
  * object_ref:
  * @obj: the object
diff --git a/qdev-monitor.c b/qdev-monitor.c
index b7e3291f8b..61e0300991 100644
--- a/qdev-monitor.c
+++ b/qdev-monitor.c
@@ -122,12 +122,6 @@ static void qdev_print_devinfo(DeviceClass *dc)
 error_printf("\n");
 }
 
-static gint devinfo_cmp(gconstpointer a, gconstpointer b)
-{
-return strcasecmp(object_class_get_name((ObjectClass *)a),
-  object_class_get_name((ObjectClass *)b));
-}
-
 static void qdev_print_devinfos(bool show_no_user)
 {
 static const char *cat_name[DEVICE_CATEGORY_MAX + 1] = {
@@ -146,8 +140,7 @@ static void qdev_print_devinfos(bool show_no_user)
 int i;
 bool cat_printed;
 
-list = g_slist_sort(object_class_get_list(TYPE_DEVICE, false),
-devinfo_cmp);
+list = object_class_get_list_sorted(TYPE_DEVICE, false);
 
 for (i = 0; i <= DEVICE_CATEGORY_MAX; i++) {
 cat_printed = false;
diff --git a/qom/object.c b/qom/object.c
index 755ad03819..6088f55943 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -891,6 +891,19 @@ GSList *object_class_get_list(const char *implements_type,
 return list;
 }
 
+static gint object_class_cmp(gconstpointer a, gconstpointer b)
+{
+return strcasecmp(object_class_get_name((ObjectClass *)a),
+  object_class_get_name((ObjectClass *)b));
+}
+
+GSList *object_class_get_list_sorted(const char *implements_type,
+ bool include_abstract)
+{
+return g_slist_sort(object_class_get_list(implements_type, 
include_abstract),
+object_class_cmp);
+}
+
 void object_ref(Object *obj)
 {
 if (!obj) {
diff --git a/target/alpha/cpu.c b/target/alpha/cpu.c
index 55675ce419..b08078e7fc 100644
--- a/target/alpha/cpu.c
+++ b/target/alpha/cpu.c
@@ -71,18 +71,6 @@ static void alpha_cpu_realizefn(DeviceState *dev, Error 
**errp)
 acc->parent_realize(dev, errp);
 }
 
-/* Sort alphabetically by type name. */
-static gint alpha_cpu_list_compare(gconstpointer a, gconstpointer b)
-{
-ObjectClass *class_a = (ObjectClass *)a;
-ObjectClass *class_b = (ObjectClass *)b;
-const char *name_a, *name_b;
-
-name_a = object_class_get_name(class_a);
-name_b = object_class_get_name(class_b);
-return strcmp(name_a, name_b);
-}
-
 static void alpha_cpu_list_entry(gpointer data, gpointer user_data)
 {
 ObjectClass *oc = data;
@@ -100,8 +88,7 @@ void alpha_cpu_list(FILE *f, fprintf_function cpu_fprintf)
 };
 GSList *list;
 
-list = object_class_get_list(TYPE_ALPHA_CPU, false);
-list = g_slist_sort(list, alpha_cpu_list_compare);
+list = object_class_get_list_sorted(TYPE_ALPHA_CPU, false);
 (*cpu_fprintf)(f, "Available CPUs:\n");
 g_slist_foreach(list, alpha_cpu_list_entry, );
 g_slist_free(list);
diff --git a/target/hppa/cpu.c b/target/hppa/cpu.c
index 969f628f0a..c261b6b090 100644
--- a/target/hppa/cpu.c
+++ b/target/hppa/cpu.c
@@ -110,18 +110,6 @@ static void hppa_cpu_realizefn(DeviceState *dev, Error 
**errp)
 #endif
 }
 
-/* Sort hppabetically by type name. */
-static gint hppa_cpu_list_compare(gconstpointer a, gconstpointer b)
-{
-ObjectClass *class_a = (ObjectClass *)a;
-ObjectClass *class_b = (ObjectClass *)b;
-const char *name_a, *name_b;
-
-name_a = object_class_get_name(class_a);
-name_b = object_class_get_name(class_b);
-return strcmp(name_a, name_b);
-}
-
 static void hppa_cpu_list_entry(gpointer data, gpointer user_data)
 {
 ObjectClass *oc = data;
@@ -138,8 +126,7 @@ void hppa_cpu_list(FILE *f, fprintf_function 

Re: [Qemu-devel] [PATCH 1/3] qom: introduce object_class_get_list_sorted

2018-03-07 Thread Thomas Huth
On 06.03.2018 20:45, Paolo Bonzini wrote:
> Unify half a dozen copies of very similar code (the only difference being
> whether comparisons were case-sensitive) and use it also in Tricore,
> which did not do any sorting of CPU model names.
> 
> Signed-off-by: Paolo Bonzini 
> ---
[...]
> diff --git a/target/hppa/cpu.c b/target/hppa/cpu.c
> index 969f628f0a..c261b6b090 100644
> --- a/target/hppa/cpu.c
> +++ b/target/hppa/cpu.c
> @@ -110,18 +110,6 @@ static void hppa_cpu_realizefn(DeviceState *dev, Error 
> **errp)
>  #endif
>  }
>  
> -/* Sort hppabetically by type name. */

Oh, what a pity to see that "hppabetically" go away, that looked like a
really neat search-and-replace bug :-)

Anyway, patch looks fine to me:

Reviewed-by: Thomas Huth 



Re: [Qemu-devel] [PATCH 1/3] qom: introduce object_class_get_list_sorted

2018-03-06 Thread Philippe Mathieu-Daudé
On 03/06/2018 01:49 PM, Paolo Bonzini wrote:
> Unify half a dozen copies of very similar code (the only difference being
> whether comparisons were case-sensitive) and use it also in Tricore,
> which did not do any sorting of CPU model names.
> 
> Signed-off-by: Paolo Bonzini 

Reviewed-by: Philippe Mathieu-Daudé 

> ---
>  include/qom/object.h| 10 ++
>  qdev-monitor.c  |  9 +
>  qom/object.c| 14 ++
>  target/alpha/cpu.c  | 15 +--
>  target/hppa/cpu.c   | 14 +-
>  target/lm32/cpu.c   | 15 +--
>  target/sh4/cpu.c| 15 +--
>  target/tricore/helper.c |  2 +-
>  8 files changed, 30 insertions(+), 64 deletions(-)
> 
> diff --git a/include/qom/object.h b/include/qom/object.h
> index 4f07090db0..12c0f58c8f 100644
> --- a/include/qom/object.h
> +++ b/include/qom/object.h
> @@ -913,6 +913,17 @@ void object_class_foreach(void (*fn)(ObjectClass *klass, 
> void *opaque),
>  GSList *object_class_get_list(const char *implements_type,
>bool include_abstract);
>  
> +/**
> + * object_class_get_list_sorted:
> + * @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 alphabetical
> + * case-insensitive order.
> + */
> +GSList *object_class_get_list_sorted(const char *implements_type,
> +  bool include_abstract);
> +
>  /**
>   * object_ref:
>   * @obj: the object
> diff --git a/qdev-monitor.c b/qdev-monitor.c
> index b7e3291f8b..61e0300991 100644
> --- a/qdev-monitor.c
> +++ b/qdev-monitor.c
> @@ -122,12 +122,6 @@ static void qdev_print_devinfo(DeviceClass *dc)
>  error_printf("\n");
>  }
>  
> -static gint devinfo_cmp(gconstpointer a, gconstpointer b)
> -{
> -return strcasecmp(object_class_get_name((ObjectClass *)a),
> -  object_class_get_name((ObjectClass *)b));
> -}
> -
>  static void qdev_print_devinfos(bool show_no_user)
>  {
>  static const char *cat_name[DEVICE_CATEGORY_MAX + 1] = {
> @@ -146,8 +140,7 @@ static void qdev_print_devinfos(bool show_no_user)
>  int i;
>  bool cat_printed;
>  
> -list = g_slist_sort(object_class_get_list(TYPE_DEVICE, false),
> -devinfo_cmp);
> +list = object_class_get_list_sorted(TYPE_DEVICE, false);
>  
>  for (i = 0; i <= DEVICE_CATEGORY_MAX; i++) {
>  cat_printed = false;
> diff --git a/qom/object.c b/qom/object.c
> index 755ad03819..6088f55943 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -891,6 +891,19 @@ GSList *object_class_get_list(const char 
> *implements_type,
>  return list;
>  }
>  
> +static gint object_class_cmp(gconstpointer a, gconstpointer b)
> +{
> +return strcasecmp(object_class_get_name((ObjectClass *)a),
> +  object_class_get_name((ObjectClass *)b));
> +}
> +
> +GSList *object_class_get_list_sorted(const char *implements_type,
> + bool include_abstract)
> +{
> +return g_slist_sort(object_class_get_list(implements_type, 
> include_abstract),
> +object_class_cmp);
> +}
> +
>  void object_ref(Object *obj)
>  {
>  if (!obj) {
> diff --git a/target/alpha/cpu.c b/target/alpha/cpu.c
> index 55675ce419..b08078e7fc 100644
> --- a/target/alpha/cpu.c
> +++ b/target/alpha/cpu.c
> @@ -71,18 +71,6 @@ static void alpha_cpu_realizefn(DeviceState *dev, Error 
> **errp)
>  acc->parent_realize(dev, errp);
>  }
>  
> -/* Sort alphabetically by type name. */
> -static gint alpha_cpu_list_compare(gconstpointer a, gconstpointer b)
> -{
> -ObjectClass *class_a = (ObjectClass *)a;
> -ObjectClass *class_b = (ObjectClass *)b;
> -const char *name_a, *name_b;
> -
> -name_a = object_class_get_name(class_a);
> -name_b = object_class_get_name(class_b);
> -return strcmp(name_a, name_b);
> -}
> -
>  static void alpha_cpu_list_entry(gpointer data, gpointer user_data)
>  {
>  ObjectClass *oc = data;
> @@ -100,8 +88,7 @@ void alpha_cpu_list(FILE *f, fprintf_function cpu_fprintf)
>  };
>  GSList *list;
>  
> -list = object_class_get_list(TYPE_ALPHA_CPU, false);
> -list = g_slist_sort(list, alpha_cpu_list_compare);
> +list = object_class_get_list_sorted(TYPE_ALPHA_CPU, false);
>  (*cpu_fprintf)(f, "Available CPUs:\n");
>  g_slist_foreach(list, alpha_cpu_list_entry, );
>  g_slist_free(list);
> diff --git a/target/hppa/cpu.c b/target/hppa/cpu.c
> index 969f628f0a..e5da8c3cab 100644
> --- a/target/hppa/cpu.c
> +++ b/target/hppa/cpu.c
> @@ -110,18 +110,6 @@ static void hppa_cpu_realizefn(DeviceState *dev, Error 
> **errp)
>  #endif
>  }
>  
> -/* Sort hppabetically by type name. */
> -static gint hppa_cpu_list_compare(gconstpointer a, gconstpointer b)
> -{
> -ObjectClass *class_a = (ObjectClass *)a;
> -

[Qemu-devel] [PATCH 1/3] qom: introduce object_class_get_list_sorted

2018-03-06 Thread Paolo Bonzini
Unify half a dozen copies of very similar code (the only difference being
whether comparisons were case-sensitive) and use it also in Tricore,
which did not do any sorting of CPU model names.

Signed-off-by: Paolo Bonzini 
---
 include/qom/object.h| 11 +++
 qdev-monitor.c  |  9 +
 qom/object.c| 13 +
 target/alpha/cpu.c  | 15 +--
 target/hppa/cpu.c   | 15 +--
 target/lm32/cpu.c   | 15 +--
 target/sh4/cpu.c| 15 +--
 target/tricore/helper.c |  2 +-
 8 files changed, 30 insertions(+), 65 deletions(-)

diff --git a/include/qom/object.h b/include/qom/object.h
index 4f07090db0..96ce81bc5e 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -913,6 +913,17 @@ void object_class_foreach(void (*fn)(ObjectClass *klass, 
void *opaque),
 GSList *object_class_get_list(const char *implements_type,
   bool include_abstract);
 
+/**
+ * object_class_get_list_sorted:
+ * @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 alphabetical
+ * case-insensitive order.
+ */
+GSList *object_class_get_list_sorted(const char *implements_type,
+ bool include_abstract);
+
 /**
  * object_ref:
  * @obj: the object
diff --git a/qdev-monitor.c b/qdev-monitor.c
index b7e3291f8b..61e0300991 100644
--- a/qdev-monitor.c
+++ b/qdev-monitor.c
@@ -122,12 +122,6 @@ static void qdev_print_devinfo(DeviceClass *dc)
 error_printf("\n");
 }
 
-static gint devinfo_cmp(gconstpointer a, gconstpointer b)
-{
-return strcasecmp(object_class_get_name((ObjectClass *)a),
-  object_class_get_name((ObjectClass *)b));
-}
-
 static void qdev_print_devinfos(bool show_no_user)
 {
 static const char *cat_name[DEVICE_CATEGORY_MAX + 1] = {
@@ -146,8 +140,7 @@ static void qdev_print_devinfos(bool show_no_user)
 int i;
 bool cat_printed;
 
-list = g_slist_sort(object_class_get_list(TYPE_DEVICE, false),
-devinfo_cmp);
+list = object_class_get_list_sorted(TYPE_DEVICE, false);
 
 for (i = 0; i <= DEVICE_CATEGORY_MAX; i++) {
 cat_printed = false;
diff --git a/qom/object.c b/qom/object.c
index 755ad03819..6088f55943 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -891,6 +891,19 @@ GSList *object_class_get_list(const char *implements_type,
 return list;
 }
 
+static gint object_class_cmp(gconstpointer a, gconstpointer b)
+{
+return strcasecmp(object_class_get_name((ObjectClass *)a),
+  object_class_get_name((ObjectClass *)b));
+}
+
+GSList *object_class_get_list_sorted(const char *implements_type,
+ bool include_abstract)
+{
+return g_slist_sort(object_class_get_list(implements_type, 
include_abstract),
+object_class_cmp);
+}
+
 void object_ref(Object *obj)
 {
 if (!obj) {
diff --git a/target/alpha/cpu.c b/target/alpha/cpu.c
index 55675ce419..b08078e7fc 100644
--- a/target/alpha/cpu.c
+++ b/target/alpha/cpu.c
@@ -71,18 +71,6 @@ static void alpha_cpu_realizefn(DeviceState *dev, Error 
**errp)
 acc->parent_realize(dev, errp);
 }
 
-/* Sort alphabetically by type name. */
-static gint alpha_cpu_list_compare(gconstpointer a, gconstpointer b)
-{
-ObjectClass *class_a = (ObjectClass *)a;
-ObjectClass *class_b = (ObjectClass *)b;
-const char *name_a, *name_b;
-
-name_a = object_class_get_name(class_a);
-name_b = object_class_get_name(class_b);
-return strcmp(name_a, name_b);
-}
-
 static void alpha_cpu_list_entry(gpointer data, gpointer user_data)
 {
 ObjectClass *oc = data;
@@ -100,8 +88,7 @@ void alpha_cpu_list(FILE *f, fprintf_function cpu_fprintf)
 };
 GSList *list;
 
-list = object_class_get_list(TYPE_ALPHA_CPU, false);
-list = g_slist_sort(list, alpha_cpu_list_compare);
+list = object_class_get_list_sorted(TYPE_ALPHA_CPU, false);
 (*cpu_fprintf)(f, "Available CPUs:\n");
 g_slist_foreach(list, alpha_cpu_list_entry, );
 g_slist_free(list);
diff --git a/target/hppa/cpu.c b/target/hppa/cpu.c
index 969f628f0a..c261b6b090 100644
--- a/target/hppa/cpu.c
+++ b/target/hppa/cpu.c
@@ -110,18 +110,6 @@ static void hppa_cpu_realizefn(DeviceState *dev, Error 
**errp)
 #endif
 }
 
-/* Sort hppabetically by type name. */
-static gint hppa_cpu_list_compare(gconstpointer a, gconstpointer b)
-{
-ObjectClass *class_a = (ObjectClass *)a;
-ObjectClass *class_b = (ObjectClass *)b;
-const char *name_a, *name_b;
-
-name_a = object_class_get_name(class_a);
-name_b = object_class_get_name(class_b);
-return strcmp(name_a, name_b);
-}
-
 static void hppa_cpu_list_entry(gpointer data, gpointer user_data)
 {
 ObjectClass *oc = data;
@@ -138,8 +126,7 @@ void hppa_cpu_list(FILE *f, fprintf_function 

[Qemu-devel] [PATCH 1/3] qom: introduce object_class_get_list_sorted

2018-03-06 Thread Paolo Bonzini
Unify half a dozen copies of very similar code (the only difference being
whether comparisons were case-sensitive) and use it also in Tricore,
which did not do any sorting of CPU model names.

Signed-off-by: Paolo Bonzini 
---
 include/qom/object.h| 10 ++
 qdev-monitor.c  |  9 +
 qom/object.c| 14 ++
 target/alpha/cpu.c  | 15 +--
 target/hppa/cpu.c   | 14 +-
 target/lm32/cpu.c   | 15 +--
 target/sh4/cpu.c| 15 +--
 target/tricore/helper.c |  2 +-
 8 files changed, 30 insertions(+), 64 deletions(-)

diff --git a/include/qom/object.h b/include/qom/object.h
index 4f07090db0..12c0f58c8f 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -913,6 +913,17 @@ void object_class_foreach(void (*fn)(ObjectClass *klass, 
void *opaque),
 GSList *object_class_get_list(const char *implements_type,
   bool include_abstract);
 
+/**
+ * object_class_get_list_sorted:
+ * @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 alphabetical
+ * case-insensitive order.
+ */
+GSList *object_class_get_list_sorted(const char *implements_type,
+  bool include_abstract);
+
 /**
  * object_ref:
  * @obj: the object
diff --git a/qdev-monitor.c b/qdev-monitor.c
index b7e3291f8b..61e0300991 100644
--- a/qdev-monitor.c
+++ b/qdev-monitor.c
@@ -122,12 +122,6 @@ static void qdev_print_devinfo(DeviceClass *dc)
 error_printf("\n");
 }
 
-static gint devinfo_cmp(gconstpointer a, gconstpointer b)
-{
-return strcasecmp(object_class_get_name((ObjectClass *)a),
-  object_class_get_name((ObjectClass *)b));
-}
-
 static void qdev_print_devinfos(bool show_no_user)
 {
 static const char *cat_name[DEVICE_CATEGORY_MAX + 1] = {
@@ -146,8 +140,7 @@ static void qdev_print_devinfos(bool show_no_user)
 int i;
 bool cat_printed;
 
-list = g_slist_sort(object_class_get_list(TYPE_DEVICE, false),
-devinfo_cmp);
+list = object_class_get_list_sorted(TYPE_DEVICE, false);
 
 for (i = 0; i <= DEVICE_CATEGORY_MAX; i++) {
 cat_printed = false;
diff --git a/qom/object.c b/qom/object.c
index 755ad03819..6088f55943 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -891,6 +891,19 @@ GSList *object_class_get_list(const char *implements_type,
 return list;
 }
 
+static gint object_class_cmp(gconstpointer a, gconstpointer b)
+{
+return strcasecmp(object_class_get_name((ObjectClass *)a),
+  object_class_get_name((ObjectClass *)b));
+}
+
+GSList *object_class_get_list_sorted(const char *implements_type,
+ bool include_abstract)
+{
+return g_slist_sort(object_class_get_list(implements_type, 
include_abstract),
+object_class_cmp);
+}
+
 void object_ref(Object *obj)
 {
 if (!obj) {
diff --git a/target/alpha/cpu.c b/target/alpha/cpu.c
index 55675ce419..b08078e7fc 100644
--- a/target/alpha/cpu.c
+++ b/target/alpha/cpu.c
@@ -71,18 +71,6 @@ static void alpha_cpu_realizefn(DeviceState *dev, Error 
**errp)
 acc->parent_realize(dev, errp);
 }
 
-/* Sort alphabetically by type name. */
-static gint alpha_cpu_list_compare(gconstpointer a, gconstpointer b)
-{
-ObjectClass *class_a = (ObjectClass *)a;
-ObjectClass *class_b = (ObjectClass *)b;
-const char *name_a, *name_b;
-
-name_a = object_class_get_name(class_a);
-name_b = object_class_get_name(class_b);
-return strcmp(name_a, name_b);
-}
-
 static void alpha_cpu_list_entry(gpointer data, gpointer user_data)
 {
 ObjectClass *oc = data;
@@ -100,8 +88,7 @@ void alpha_cpu_list(FILE *f, fprintf_function cpu_fprintf)
 };
 GSList *list;
 
-list = object_class_get_list(TYPE_ALPHA_CPU, false);
-list = g_slist_sort(list, alpha_cpu_list_compare);
+list = object_class_get_list_sorted(TYPE_ALPHA_CPU, false);
 (*cpu_fprintf)(f, "Available CPUs:\n");
 g_slist_foreach(list, alpha_cpu_list_entry, );
 g_slist_free(list);
diff --git a/target/hppa/cpu.c b/target/hppa/cpu.c
index 969f628f0a..e5da8c3cab 100644
--- a/target/hppa/cpu.c
+++ b/target/hppa/cpu.c
@@ -110,18 +110,6 @@ static void hppa_cpu_realizefn(DeviceState *dev, Error 
**errp)
 #endif
 }
 
-/* Sort hppabetically by type name. */
-static gint hppa_cpu_list_compare(gconstpointer a, gconstpointer b)
-{
-ObjectClass *class_a = (ObjectClass *)a;
-ObjectClass *class_b = (ObjectClass *)b;
-const char *name_a, *name_b;
-
-name_a = object_class_get_name(class_a);
-name_b = object_class_get_name(class_b);
-return strcmp(name_a, name_b);
-}
-
 static void hppa_cpu_list_entry(gpointer data, gpointer user_data)
 {
 ObjectClass *oc = data;
@@ -138,7 +126,7 @@ void hppa_cpu_list(FILE *f, fprintf_function