mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-05 20:35:44 +00:00
qapi: Simplify use of range.h
Calling our function g_list_insert_sorted_merged is a misnomer, since we are NOT writing a glib function. Furthermore, we are making every caller pass the same comparator function of range_merge(): any caller that would try otherwise would break in weird ways since our internal call to ranges_can_merge() is hard-coded to operate only on ranges, rather than paying attention to the caller's comparator. Better is to fix things so that callers don't have to care about our internal comparator, by picking a function name and updating the parameter type away from a gratuitous use of void*, to make it obvious that we are operating specifically on a list of ranges and not a generic list. Plus, refactoring the code here will make it easier to plug a memory leak in the next patch. range_compare() is now internal only, and moves to the .c file. Signed-off-by: Eric Blake <eblake@redhat.com> Message-Id: <1464712890-14262-3-git-send-email-eblake@redhat.com> Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
parent
fec0fc0a13
commit
7c47959d0c
4 changed files with 23 additions and 34 deletions
|
@ -79,20 +79,6 @@ static inline int ranges_overlap(uint64_t first1, uint64_t len1,
|
|||
return !(last2 < first1 || last1 < first2);
|
||||
}
|
||||
|
||||
GList *g_list_insert_sorted_merged(GList *list, gpointer data,
|
||||
GCompareFunc func);
|
||||
|
||||
static inline gint range_compare(gconstpointer a, gconstpointer b)
|
||||
{
|
||||
Range *ra = (Range *)a, *rb = (Range *)b;
|
||||
if (ra->begin == rb->begin && ra->end == rb->end) {
|
||||
return 0;
|
||||
} else if (range_get_last(ra->begin, ra->end) <
|
||||
range_get_last(rb->begin, rb->end)) {
|
||||
return -1;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
GList *range_list_insert(GList *list, Range *data);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -61,8 +61,7 @@ static int parse_str(StringInputVisitor *siv, const char *name, Error **errp)
|
|||
cur = g_malloc0(sizeof(*cur));
|
||||
cur->begin = start;
|
||||
cur->end = start + 1;
|
||||
siv->ranges = g_list_insert_sorted_merged(siv->ranges, cur,
|
||||
range_compare);
|
||||
siv->ranges = range_list_insert(siv->ranges, cur);
|
||||
cur = NULL;
|
||||
str = NULL;
|
||||
} else if (*endptr == '-') {
|
||||
|
@ -76,10 +75,7 @@ static int parse_str(StringInputVisitor *siv, const char *name, Error **errp)
|
|||
cur = g_malloc0(sizeof(*cur));
|
||||
cur->begin = start;
|
||||
cur->end = end + 1;
|
||||
siv->ranges =
|
||||
g_list_insert_sorted_merged(siv->ranges,
|
||||
cur,
|
||||
range_compare);
|
||||
siv->ranges = range_list_insert(siv->ranges, cur);
|
||||
cur = NULL;
|
||||
str = NULL;
|
||||
} else if (*endptr == ',') {
|
||||
|
@ -87,10 +83,7 @@ static int parse_str(StringInputVisitor *siv, const char *name, Error **errp)
|
|||
cur = g_malloc0(sizeof(*cur));
|
||||
cur->begin = start;
|
||||
cur->end = end + 1;
|
||||
siv->ranges =
|
||||
g_list_insert_sorted_merged(siv->ranges,
|
||||
cur,
|
||||
range_compare);
|
||||
siv->ranges = range_list_insert(siv->ranges, cur);
|
||||
cur = NULL;
|
||||
} else {
|
||||
goto error;
|
||||
|
@ -103,9 +96,7 @@ static int parse_str(StringInputVisitor *siv, const char *name, Error **errp)
|
|||
cur = g_malloc0(sizeof(*cur));
|
||||
cur->begin = start;
|
||||
cur->end = start + 1;
|
||||
siv->ranges = g_list_insert_sorted_merged(siv->ranges,
|
||||
cur,
|
||||
range_compare);
|
||||
siv->ranges = range_list_insert(siv->ranges, cur);
|
||||
cur = NULL;
|
||||
} else {
|
||||
goto error;
|
||||
|
|
|
@ -85,7 +85,7 @@ static void string_output_append(StringOutputVisitor *sov, int64_t a)
|
|||
Range *r = g_malloc0(sizeof(*r));
|
||||
r->begin = a;
|
||||
r->end = a + 1;
|
||||
sov->ranges = g_list_insert_sorted_merged(sov->ranges, r, range_compare);
|
||||
sov->ranges = range_list_insert(sov->ranges, r);
|
||||
}
|
||||
|
||||
static void string_output_append_range(StringOutputVisitor *sov,
|
||||
|
@ -94,7 +94,7 @@ static void string_output_append_range(StringOutputVisitor *sov,
|
|||
Range *r = g_malloc0(sizeof(*r));
|
||||
r->begin = s;
|
||||
r->end = e + 1;
|
||||
sov->ranges = g_list_insert_sorted_merged(sov->ranges, r, range_compare);
|
||||
sov->ranges = range_list_insert(sov->ranges, r);
|
||||
}
|
||||
|
||||
static void format_string(StringOutputVisitor *sov, Range *r, bool next,
|
||||
|
|
20
util/range.c
20
util/range.c
|
@ -44,14 +44,26 @@ static void range_merge(Range *range1, Range *range2)
|
|||
}
|
||||
}
|
||||
|
||||
GList *g_list_insert_sorted_merged(GList *list, gpointer data,
|
||||
GCompareFunc func)
|
||||
static gint range_compare(gconstpointer a, gconstpointer b)
|
||||
{
|
||||
Range *ra = (Range *)a, *rb = (Range *)b;
|
||||
if (ra->begin == rb->begin && ra->end == rb->end) {
|
||||
return 0;
|
||||
} else if (range_get_last(ra->begin, ra->end) <
|
||||
range_get_last(rb->begin, rb->end)) {
|
||||
return -1;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
GList *range_list_insert(GList *list, Range *data)
|
||||
{
|
||||
GList *l, *next = NULL;
|
||||
Range *r, *nextr;
|
||||
|
||||
if (!list) {
|
||||
list = g_list_insert_sorted(list, data, func);
|
||||
list = g_list_insert_sorted(list, data, range_compare);
|
||||
return list;
|
||||
}
|
||||
|
||||
|
@ -74,7 +86,7 @@ GList *g_list_insert_sorted_merged(GList *list, gpointer data,
|
|||
}
|
||||
|
||||
if (!l) {
|
||||
list = g_list_insert_sorted(list, data, func);
|
||||
list = g_list_insert_sorted(list, data, range_compare);
|
||||
}
|
||||
|
||||
return list;
|
||||
|
|
Loading…
Reference in a new issue