diff options
| author | Junio C Hamano <gitster@pobox.com> | 2017-01-31 13:15:00 -0800 |
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2017-01-31 13:15:00 -0800 |
| commit | 6ad8b8e98faa5a301a98a2997da162dea060672e (patch) | |
| tree | 99ca685d15df287c1f686c033157756d439c119c /string-list.c | |
| parent | 4e170adc8ad654bddb9421a4bf51bb4802656262 (diff) | |
| parent | 83fc4d64fec779d73b18494461613ef911236daf (diff) | |
| download | git-6ad8b8e98faa5a301a98a2997da162dea060672e.tar.gz | |
Merge branch 'rs/qsort-s'
A few codepaths had to rely on a global variable when sorting
elements of an array because sort(3) API does not allow extra data
to be passed to the comparison function. Use qsort_s() when
natively available, and a fallback implementation of it when not,
to eliminate the need, which is a prerequisite for making the
codepath reentrant.
* rs/qsort-s:
ref-filter: use QSORT_S in ref_array_sort()
string-list: use QSORT_S in string_list_sort()
perf: add basic sort performance test
add QSORT_S
compat: add qsort_s()
Diffstat (limited to 'string-list.c')
| -rw-r--r-- | string-list.c | 13 |
1 files changed, 5 insertions, 8 deletions
diff --git a/string-list.c b/string-list.c index 8c83cac189..45016ad86d 100644 --- a/string-list.c +++ b/string-list.c @@ -211,21 +211,18 @@ struct string_list_item *string_list_append(struct string_list *list, list->strdup_strings ? xstrdup(string) : (char *)string); } -/* Yuck */ -static compare_strings_fn compare_for_qsort; - -/* Only call this from inside string_list_sort! */ -static int cmp_items(const void *a, const void *b) +static int cmp_items(const void *a, const void *b, void *ctx) { + compare_strings_fn cmp = ctx; const struct string_list_item *one = a; const struct string_list_item *two = b; - return compare_for_qsort(one->string, two->string); + return cmp(one->string, two->string); } void string_list_sort(struct string_list *list) { - compare_for_qsort = list->cmp ? list->cmp : strcmp; - QSORT(list->items, list->nr, cmp_items); + QSORT_S(list->items, list->nr, cmp_items, + list->cmp ? list->cmp : strcmp); } struct string_list_item *unsorted_string_list_lookup(struct string_list *list, |
