qom: introduce object_class_get_list_sorted
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. Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
819fd4699c
commit
47c66009ab
@ -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
|
||||
|
@ -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;
|
||||
|
13
qom/object.c
13
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) {
|
||||
|
@ -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, &s);
|
||||
g_slist_free(list);
|
||||
|
@ -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 cpu_fprintf)
|
||||
};
|
||||
GSList *list;
|
||||
|
||||
list = object_class_get_list(TYPE_HPPA_CPU, false);
|
||||
list = g_slist_sort(list, hppa_cpu_list_compare);
|
||||
list = object_class_get_list_sorted(TYPE_HPPA_CPU, false);
|
||||
(*cpu_fprintf)(f, "Available CPUs:\n");
|
||||
g_slist_foreach(list, hppa_cpu_list_entry, &s);
|
||||
g_slist_free(list);
|
||||
|
@ -32,18 +32,6 @@ static void lm32_cpu_set_pc(CPUState *cs, vaddr value)
|
||||
cpu->env.pc = value;
|
||||
}
|
||||
|
||||
/* Sort alphabetically by type name. */
|
||||
static gint lm32_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 lm32_cpu_list_entry(gpointer data, gpointer user_data)
|
||||
{
|
||||
ObjectClass *oc = data;
|
||||
@ -65,8 +53,7 @@ void lm32_cpu_list(FILE *f, fprintf_function cpu_fprintf)
|
||||
};
|
||||
GSList *list;
|
||||
|
||||
list = object_class_get_list(TYPE_LM32_CPU, false);
|
||||
list = g_slist_sort(list, lm32_cpu_list_compare);
|
||||
list = object_class_get_list_sorted(TYPE_LM32_CPU, false);
|
||||
(*cpu_fprintf)(f, "Available CPUs:\n");
|
||||
g_slist_foreach(list, lm32_cpu_list_entry, &s);
|
||||
g_slist_free(list);
|
||||
|
@ -85,18 +85,6 @@ typedef struct SuperHCPUListState {
|
||||
FILE *file;
|
||||
} SuperHCPUListState;
|
||||
|
||||
/* Sort alphabetically by type name. */
|
||||
static gint superh_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 superh_cpu_list_entry(gpointer data, gpointer user_data)
|
||||
{
|
||||
SuperHCPUListState *s = user_data;
|
||||
@ -114,8 +102,7 @@ void sh4_cpu_list(FILE *f, fprintf_function cpu_fprintf)
|
||||
};
|
||||
GSList *list;
|
||||
|
||||
list = object_class_get_list(TYPE_SUPERH_CPU, false);
|
||||
list = g_slist_sort(list, superh_cpu_list_compare);
|
||||
list = object_class_get_list_sorted(TYPE_SUPERH_CPU, false);
|
||||
g_slist_foreach(list, superh_cpu_list_entry, &s);
|
||||
g_slist_free(list);
|
||||
}
|
||||
|
@ -101,7 +101,7 @@ void tricore_cpu_list(FILE *f, fprintf_function cpu_fprintf)
|
||||
};
|
||||
GSList *list;
|
||||
|
||||
list = object_class_get_list(TYPE_TRICORE_CPU, false);
|
||||
list = object_class_get_list_sorted(TYPE_TRICORE_CPU, false);
|
||||
(*cpu_fprintf)(f, "Available CPUs:\n");
|
||||
g_slist_foreach(list, tricore_cpu_list_entry, &s);
|
||||
g_slist_free(list);
|
||||
|
Loading…
Reference in New Issue
Block a user