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()
This commit is contained in:
@ -97,6 +97,31 @@ int cmd_main(int argc, const char **argv)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (argc == 2 && !strcmp(argv[1], "sort")) {
|
||||
struct string_list list = STRING_LIST_INIT_NODUP;
|
||||
struct strbuf sb = STRBUF_INIT;
|
||||
struct string_list_item *item;
|
||||
|
||||
strbuf_read(&sb, 0, 0);
|
||||
|
||||
/*
|
||||
* Split by newline, but don't create a string_list item
|
||||
* for the empty string after the last separator.
|
||||
*/
|
||||
if (sb.buf[sb.len - 1] == '\n')
|
||||
strbuf_setlen(&sb, sb.len - 1);
|
||||
string_list_split_in_place(&list, sb.buf, '\n', -1);
|
||||
|
||||
string_list_sort(&list);
|
||||
|
||||
for_each_string_list_item(item, &list)
|
||||
puts(item->string);
|
||||
|
||||
string_list_clear(&list, 0);
|
||||
strbuf_release(&sb);
|
||||
return 0;
|
||||
}
|
||||
|
||||
fprintf(stderr, "%s: unknown function name: %s\n", argv[0],
|
||||
argv[1] ? argv[1] : "(there was none)");
|
||||
return 1;
|
||||
|
26
t/perf/p0071-sort.sh
Executable file
26
t/perf/p0071-sort.sh
Executable file
@ -0,0 +1,26 @@
|
||||
#!/bin/sh
|
||||
|
||||
test_description='Basic sort performance tests'
|
||||
. ./perf-lib.sh
|
||||
|
||||
test_perf_default_repo
|
||||
|
||||
test_expect_success 'setup' '
|
||||
git ls-files --stage "*.[ch]" "*.sh" |
|
||||
cut -f2 -d" " |
|
||||
git cat-file --batch >unsorted
|
||||
'
|
||||
|
||||
test_perf 'sort(1)' '
|
||||
sort <unsorted >expect
|
||||
'
|
||||
|
||||
test_perf 'string_list_sort()' '
|
||||
test-string-list sort <unsorted >actual
|
||||
'
|
||||
|
||||
test_expect_success 'string_list_sort() sorts like sort(1)' '
|
||||
test_cmp_bin expect actual
|
||||
'
|
||||
|
||||
test_done
|
Reference in New Issue
Block a user