]> git.ipfire.org Git - thirdparty/git.git/commitdiff
stable-qsort: avoid using potentially unaligned access
authorRené Scharfe <l.s.r@web.de>
Fri, 7 Jan 2022 23:30:44 +0000 (00:30 +0100)
committerJunio C Hamano <gitster@pobox.com>
Fri, 7 Jan 2022 23:48:40 +0000 (15:48 -0800)
Like in the previous patch for compat/qsort_s.c, remove the optimization
of using an on-stack buffer to avoid small allocations.  This ensures
maximum alignment for the array elements and simplifies the code a bit.

The performance impact for the current callers is unlikely to be
noticeable:

 * compat/mingw.c::make_environment_block() uses ALLOC_ARRAY and
   ALLOC_GROW several times already, so another allocation of up to 1KB
   should not matter much.

 * diffcore-rename.c::diffcore_rename_extended() is called once per diff
   or twice per merge, and those require allocations for each object and
   more already.

 * merge-ort.c::detect_and_process_renames() is called once per merge.
   It's responsible for the two per-merge diffcore_rename_extended()
   calls mentioned above as well, though.  So this is possibly the most
   impacted caller.  Per-object allocations are likely to dwarf the
   additional small allocations in git_stable_qsort(), though.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
stable-qsort.c

index 6cbaf39f7b6ccbb265d77dd17d8c3146d629ca90..7ff12467cdbed54326e2209a39fda4ae68b02f36 100644 (file)
@@ -48,15 +48,9 @@ void git_stable_qsort(void *b, size_t n, size_t s,
                      int (*cmp)(const void *, const void *))
 {
        const size_t size = st_mult(n, s);
-       char buf[1024];
-
-       if (size < sizeof(buf)) {
-               /* The temporary array fits on the small on-stack buffer. */
-               msort_with_tmp(b, n, s, cmp, buf);
-       } else {
-               /* It's somewhat large, so malloc it.  */
-               char *tmp = xmalloc(size);
-               msort_with_tmp(b, n, s, cmp, tmp);
-               free(tmp);
-       }
+       char *tmp;
+
+       tmp = xmalloc(size);
+       msort_with_tmp(b, n, s, cmp, tmp);
+       free(tmp);
 }