glibc/include
Adhemerval Zanella 03bf8357e8 stdlib: Remove use of mergesort on qsort (BZ 21719)
This patch removes the mergesort optimization on qsort implementation
and uses the introsort instead.  The mergesort implementation has some
issues:

  - It is as-safe only for certain types sizes (if total size is less
    than 1 KB with large element sizes also forcing memory allocation)
    which contradicts the function documentation.  Although not required
    by the C standard, it is preferable and doable to have an O(1) space
    implementation.

  - The malloc for certain element size and element number adds
    arbitrary latency (might even be worse if malloc is interposed).

  - To avoid trigger swap from memory allocation the implementation
    relies on system information that might be virtualized (for instance
    VMs with overcommit memory) which might lead to potentially use of
    swap even if system advertise more memory than actually has.  The
    check also have the downside of issuing syscalls where none is
    expected (although only once per execution).

  - The mergesort is suboptimal on an already sorted array (BZ#21719).

The introsort implementation is already optimized to use constant extra
space (due to the limit of total number of elements from maximum VM
size) and thus can be used to avoid the malloc usage issues.

Resulting performance is slower due the usage of qsort, specially in the
worst-case scenario (partialy or sorted arrays) and due the fact
mergesort uses a slight improved swap operations.

This change also renders the BZ#21719 fix unrequired (since it is meant
to fix the sorted input performance degradation for mergesort).  The
manual is also updated to indicate the function is now async-cancel
safe.

Checked on x86_64-linux-gnu.
Reviewed-by: Noah Goldstein <goldstein.w.n@gmail.com>
2023-10-31 14:18:05 -03:00
..
arpa Fix all the remaining misspellings -- BZ 25337 2023-06-02 01:39:48 +00:00
bits misc/bits/syslog.h: Clearly separate declaration from definition 2023-07-05 16:59:48 +02:00
gnu
net
netinet
programs
protocols
rpc
rpcsvc
sys misc/bits/syslog.h: Clearly separate declaration from definition 2023-07-05 16:59:48 +02:00
aio.h
aliases.h Move 'aliases' routines from 'inet' into 'nss' 2023-10-24 12:30:59 +02:00
alloc_buffer.h Fix all the remaining misspellings -- BZ 25337 2023-06-02 01:39:48 +00:00
alloca.h
allocate_once.h
ar.h
argp-fmtstream.h
argp.h
argz.h
array_length.h
assert.h
atomic.h
atomic_wide_counter.h
byteswap.h
clone_internal.h posix: Add pidfd_spawn and pidfd_spawnp (BZ 30349) 2023-09-05 13:08:59 -03:00
complex.h
cpio.h
ctype.h
des.h
dirent.h
dlfcn.h
dso_handle.h
elf.h
endian.h
envz.h
err.h
errno.h
error.h
execinfo.h
fcntl.h
features-time64.h
features.h Increase version numbers 2023-07-30 21:35:28 +02:00
fenv.h
file_change_detection.h Fix all the remaining misspellings -- BZ 25337 2023-06-02 01:39:48 +00:00
filename.h
float.h
fmtmsg.h
fnmatch.h
fpu_control.h
fstab.h
fts.h
ftw.h
gconv.h
getopt.h
getopt_int.h
glob.h
gmp.h
gnu-versions.h
grp-merge.h Remove 'grp' and merge into 'nss' and 'posix' 2023-10-24 12:30:59 +02:00
grp.h Remove 'grp' and merge into 'nss' and 'posix' 2023-10-24 12:30:59 +02:00
gshadow.h Remove 'gshadow' and merge into 'nss' 2023-10-24 12:30:59 +02:00
iconv.h
idx.h
ifaddrs.h nscd: Do not rebuild getaddrinfo (bug 30709) 2023-08-11 10:10:16 +02:00
ifreq.h
ifunc-impl-list.h
inline-hashtab.h
intprops.h
inttypes.h
langinfo.h
lastlog.h
libc-diag.h
libc-internal.h
libc-pointer-arith.h Fix all the remaining misspellings -- BZ 25337 2023-06-02 01:39:48 +00:00
libc-symbols.h Fix all the remaining misspellings -- BZ 25337 2023-06-02 01:39:48 +00:00
libgen.h
libintl.h
limits.h
link.h Revert "elf: Always call destructors in reverse constructor order (bug 30785)" 2023-10-18 11:30:38 +02:00
list.h
list_t.h
locale.h
loop_unroll.h
malloc.h
math-narrow-eval.h
math.h
mcheck.h
memory.h
mntent.h
monetary.h
mqueue.h
netdb.h Move 'netgroup' routines from 'inet' into 'nss' 2023-10-24 12:30:59 +02:00
netgroup.h Move 'netgroup' routines from 'inet' into 'nss' 2023-10-24 12:30:59 +02:00
nl_types.h
nss.h
nss_dns.h
nss_files.h
nsswitch.h
obstack.h
plural-exp.h
poll.h
printf.h
printf_buffer.h Fix all the remaining misspellings -- BZ 25337 2023-06-02 01:39:48 +00:00
pthread.h
pty.h
pwd.h Remove 'pwd' and merge into 'nss' 2023-10-24 12:30:59 +02:00
random-bits.h
re_comp.h
regex.h
regexp.h
register-atfork.h
resolv.h
rounding-mode.h
rtld-malloc.h
sched.h
scratch_buffer.h
search.h
set-freeres.h Fix a few more typos I missed in previous round -- BZ 25337 2023-06-02 23:46:32 +00:00
setjmp.h chk: Add and fix hidden builtin definitions for *_chk 2023-08-03 22:46:48 +02:00
sgtty.h
shadow.h Remove 'shadow' and merge into 'nss' 2023-10-24 12:30:59 +02:00
shlib-compat.h
shm-directory.h
signal.h
spawn.h
stab.h
stackinfo.h
stap-probe.h
stdc-predef.h
stdint.h
stdio.h stdio: Remove __libc_message alloca usage 2023-09-11 16:16:49 +00:00
stdio_ext.h
stdlib.h stdlib: Remove use of mergesort on qsort (BZ 21719) 2023-10-31 14:18:05 -03:00
string.h chk: Add and fix hidden builtin definitions for *_chk 2023-08-03 22:46:48 +02:00
strings.h
struct___timeb64.h
struct___timespec64.h
struct___timeval64.h
stubs-prologue.h
syscall.h
sysexits.h
syslog.h
tar.h
termios.h
tgmath.h
time.h
ttyent.h
uchar.h
ucontext.h
ulimit.h
unistd.h unistd: Avoid PLT entries with _FORTIFY_SOURCE 2023-07-05 16:59:48 +02:00
unistd_ext.h Move {read,write}_all functions to a dedicated header 2023-06-06 08:23:53 -04:00
utime.h
utmp.h
values.h
verify.h
wait.h
wchar.h wchar: Avoid PLT entries with _FORTIFY_SOURCE 2023-07-05 16:59:48 +02:00
wctype.h
wordexp.h