The previous check did not do anything because tmp_ptr already
points before run_ptr due to the way it is initialized.
Fixes commit e4d8117b82
("stdlib: Avoid another self-comparison in qsort").
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
The existing logic avoided internal stack overflow. To avoid
a denial-of-service condition with adversarial input, it is necessary
to fall over to heapsort if tail-recursing deeply, too, which does
not result in a deep stack of pending partitions.
The new test stdlib/tst-qsort5 is based on Douglas McIlroy's paper
on this subject.
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
The previous implementation did not consistently apply the rule that
the child nodes of node K are at 2 * K + 1 and 2 * K + 2, or
that the parent node is at (K - 1) / 2.
Add an internal test that targets the heapsort implementation
directly.
Reported-by: Stepan Golosunov <stepan@golosunov.pp.ru>
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
In the insertion phase, we could run off the start of the array if the
comparison function never runs zero. In that case, it never finds the
initial element that terminates the iteration.
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
This improves compatibility with applications which assume that qsort
does not invoke the comparison function with equal pointer arguments.
The newly introduced branches should be predictable, as leading to a
call to the comparison function. If the prediction fails, we avoid
calling the function.
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
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>
This patch makes the quicksort implementation to acts as introsort, to
avoid worse-case performance (and thus making it O(nlog n)). It switch
to heapsort when the depth level reaches 2*log2(total elements). The
heapsort is a textbook implementation.
Checked on x86_64-linux-gnu and aarch64-linux-gnu.
Reviewed-by: Noah Goldstein <goldstein.w.n@gmail.com>
The optimization takes in consideration both the most common elements
are either 32 or 64 bit in size and inputs are aligned to the word
boundary. This is similar to what msort does.
For large buffer the swap operation uses memcpy/mempcpy with a
small fixed size buffer (so compiler might inline the operations).
Checked on x86_64-linux-gnu.
Reviewed-by: Noah Goldstein <goldstein.w.n@gmail.com>
I used these shell commands:
../glibc/scripts/update-copyrights $PWD/../gnulib/build-aux/update-copyright
(cd ../glibc && git commit -am"[this commit message]")
and then ignored the output, which consisted lines saying "FOO: warning:
copyright statement not found" for each of 7061 files FOO.
I then removed trailing white space from math/tgmath.h,
support/tst-support-open-dev-null-range.c, and
sysdeps/x86_64/multiarch/strlen-vec.S, to work around the following
obscure pre-commit check failure diagnostics from Savannah. I don't
know why I run into these diagnostics whereas others evidently do not.
remote: *** 912-#endif
remote: *** 913:
remote: *** 914-
remote: *** error: lines with trailing whitespace found
...
remote: *** error: sysdeps/unix/sysv/linux/statx_cp.c: trailing lines
We stopped adding "Contributed by" or similar lines in sources in 2012
in favour of git logs and keeping the Contributors section of the
glibc manual up to date. Removing these lines makes the license
header a bit more consistent across files and also removes the
possibility of error in attribution when license blocks or files are
copied across since the contributed-by lines don't actually reflect
reality in those cases.
Move all "Contributed by" and similar lines (Written by, Test by,
etc.) into a new file CONTRIBUTED-BY to retain record of these
contributions. These contributors are also mentioned in
manual/contrib.texi, so we just maintain this additional record as a
courtesy to the earlier developers.
The following scripts were used to filter a list of files to edit in
place and to clean up the CONTRIBUTED-BY file respectively. These
were not added to the glibc sources because they're not expected to be
of any use in future given that this is a one time task:
https://gist.github.com/siddhesh/b5ecac94eabfd72ed2916d6d8157e7dchttps://gist.github.com/siddhesh/15ea1f5e435ace9774f485030695ee02
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
I used these shell commands:
../glibc/scripts/update-copyrights $PWD/../gnulib/build-aux/update-copyright
(cd ../glibc && git commit -am"[this commit message]")
and then ignored the output, which consisted lines saying "FOO: warning:
copyright statement not found" for each of 6694 files FOO.
I then removed trailing white space from benchtests/bench-pthread-locks.c
and iconvdata/tst-iconv-big5-hkscs-to-2ucs4.c, to work around this
diagnostic from Savannah:
remote: *** pre-commit check failed ...
remote: *** error: lines with trailing whitespace found
remote: error: hook declined to update refs/heads/master
* include/stdlib.h: Add hidden_proto for qsort_t and adjust protoype
for _quicksort.
* stdlib/msort.c (qsort): Now a wrapper around qsort_r.
(qsort_r): Renamed from qsort. Take additional parameter and pass it
on as third parameter to compare function and _quicksort.
* stdlib/qsort.c (_quicksort): Take additional parameter and pass on
to the compare function.
* stdlib/Versions [libc] (GLIBC_2.8): Add qsort_r.
* Versions.def: Add GLIBC_2.8 for libc.
2002-01-18 Wolfram Gloger <wg@malloc.de>
* malloc/malloc.c: Rewrite, adapted from Doug Lea's malloc-2.7.0.c.
* malloc/malloc.h: Likewise.
* malloc/arena.c: New file.
* malloc/hooks.c: New file.
* malloc/tst-mallocstate.c: New file.
* malloc/Makefile: Add new testcase tst-mallocstate.
Add arena.c and hooks.c to distribute. Fix commented CPPFLAGS.
2002-01-28 Ulrich Drepper <drepper@redhat.com>
* stdlib/msort.c: Remove last patch. The optimization violates the
same rule which qsort.c had problems with.
2002-01-27 Paul Eggert <eggert@twinsun.com>
* stdlib/qsort.c (_quicksort): Do not apply the comparison function
to a pivot element that lies outside the array to be sorted, as
ISO C99 requires that the comparison function be called only with
addresses of array elements [PR libc/2880].
2001-07-06 Paul Eggert <eggert@twinsun.com>
* manual/argp.texi: Remove ignored LGPL copyright notice; it's
not appropriate for documentation anyway.
* manual/libc-texinfo.sh: "Library General Public License" ->
"Lesser General Public License".
2001-07-06 Andreas Jaeger <aj@suse.de>
* All files under GPL/LGPL version 2: Place under LGPL version
2.1.
1999-10-26 Andreas Jaeger <aj@suse.de>
* stdlib/msort.c: Include <alloca.h> for prototype.
Remove K&R compatibility and _quicksort prototype.
* stdlib/qsort.c: Make code and comments 64 bit clean; clarify
some comments.
Reported by Bernd Löchner <loechner@informatik.uni-kl.de>.
Remove K&R compatibility.
Move prototype declaration to include/stdlib.h.
Include <alloca.h> for prototype; include <limits.h> for CHAR_BIT.
* include/stdlib.h: Prototype declaration for _quicksort.
1997-02-19 03:28 Miles Bader <miles@gnu.ai.mit.edu>
* argp/argp-help.c: Add support for user provided filter of help
messages.
* argp/argp-parse.c: Likewise.
* argp/argp.h: Likewise.
* argp/argp-namefrob.h: Define __argp_input.
* argp/argp-test.c: Add example for filter.
1997-02-19 02:58 Ulrich Drepper <drepper@cygnus.com>
* argp.h: New file.
* locale/programs/locale.c: Switch to use argp.
* errno.h: Make it possible to get definition of error_t even
after having errno.h already.
* elf/dl-hash.h: New file. ELF hashing function. Extracted
from dl-lookup.c.
* elf/dl-lookup.c (_dl_elf_hash): Remove definition.
* elf/dl-load.c: Rename _dl_does_name_match_p to _dl_name_match_p.
* elf/dl-version.c: Likewise.
* elf/dl-lookup.c: Implement new versioning lookup scheme.
* elf/dl-version.c (_dl_check_map_versions): Initialize new field
in l_versions member.
* elf/dlvsym.c: Correct call of _dl_lookup_versioned_symbol_skip
and _dl_lookup_versioned_symbol.
* elf/link.h: Rename hash_name_pair to struct r_found_version.
* sysdeps/alpha/dl-machine.h: Likewise.
* sysdeps/i386/dl-machine.h: Likewise.
* sysdeps/m68k/dl-machine.h: Likewise.
* sysdeps/mips/dl-machine.h: Likewise.
* intl/l10nflist.c: (_nl_make_l10nflist): Fix bug in computation of
length of abs_filename.
* locale/Makefile (CPPFLAGS): Define LOCALE_ALIAS_PATH.
* locale/programs/ld-monetary.c (monetary_add): Allow value 0
in mon_grouping information. This means no more grouping.
* locale/programs/ld-numeric.c (numeric_add): Write value \377
when seein value 0 in grouping information.
* locale/programs/linereader.c (lr_close): Don't free fname since
it might be used in error messages.
* locale/programs/locale.c: Check whether output of `locale -a'
really is locale directory. Also print locale aliases.
* misc/search.h (__action_fn_t): Parameters VALUE and LEVEL cannot
be const.
1997-02-19 02:16 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/unix/bsd/sun/sunos4/resourcebits.h: Correct #defin to
#define. Reported by Rick Flower <FLOWER@sdvax2.sdd.TRW.COM>.
1997-02-19 01:37 Erik Troan <ewt@redhat.com>
* shadow/sgetspent_r.c: Accept empty third, fourth and fifth fields.
1997-02-19 01:02 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/unix/mman/syscalls.list: msync takes 3 arguments.
Reported by Andreas Jaeger <aj@arthur.pfalz.de>.
* sysdeps/stub/msync.c (msync): Add missing third parameter.
1997-02-19 00:29 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/unix/bsd/sigsuspend.c: Call __sigpause with needed
additional argument.
1997-02-18 22:13 Ulrich Drepper <drepper@cygnus.com>
* inet/net/ethernet.h: New file.
* sysdeps/unix/sysv/linux/netinet/if_ether.c: Add BSD compatibility.
* sysdeps/unix/sysv/linux/net/if_slip.h: New file.
Contributed by a sun <asun@zoology.washington.edu>.
* sysdeps/unix/sysv/linux/net/if_arp.h: Include <sys/socket.h>.
* sunrpc/rpc/rpc_msg.h: Include <rpc/clnt.h>.
Reported by a sun <asun@zoology.washington.edu>.
1997-02-16 14:25 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* Makerules ((common-objpfx)distinfo-$(subdir)): Depend on sysdep
makefiles which may change the distinfo variables.
1997-02-16 14:03 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sysdeps/unix/sysv/linux/Makefile (sysdep_headers)
[$(subdir)=misc]: Add sys/quota.h.
(sysdep_headers) [$(subdir)=inet]: Add netinet/udp.h.
1997-02-17 13:12 aleph1@dfw.net
* sunrpc/clnt_simp.c (callrpc): Prevent buffer overflow by using
strncpy.
1997-02-18 03:28 Ulrich Drepper <drepper@cygnus.com>
* stdio-common/bug10.c (main): Correct parameter.
1997-02-17 02:51 Ulrich Drepper <drepper@cygnus.com>
* malloc/obstack.h: Add `extern "C"' protection.
* posix/regex.h: Likewise.
* io/ftw.h: Likewise.
* misc/libgen.h: Likewise.
* login/utmp.h: Likewise.
* sysdeps/unix/sysv/linux/sys/reboot.h: Likewise.
* sysdeps/unix/sysv/linux/netinet/in.h: Likewise.
* sunrpc/rpc/pmap_rmt.h: Likewise.
* sunrpc/rpc/auth_des.h: Likewise.
* elf/link.h: Likewise.
Reported by HJ Lu.
1997-02-17 01:45 a sun <asun@zoology.washington.edu>
Linux specific network headers.
* sysdeps/unix/sysv/linux/netinet/if_fddi.h: New file.
* sysdeps/unix/sysv/linux/netinet/if_tr.h: New file.
* sysdeps/unix/sysv/linux/netinet/ip_icmp.h: New file.
* sysdeps/unix/sysv/linux/netinet/ip_fw.h: New file.
* sysdeps/unix/sysv/linux/netinet/igmp.h: New file.
* sysdeps/unix/sysv/linux/netinet/icmp.h: New file.
* sysdeps/unix/sysv/linux/netinet/ip.h: New file.
* sysdeps/unix/sysv/linux/netinet/tcp.h: New file.
* sysdeps/unix/sysv/linux/netipx/ipx.h: New file.
* sysdeps/unix/sysv/linux/netatalk/atalk.h: New file.
* sysdeps/unix/sysv/linux/Dist: Add new network headers.
* sysdeps/unix/sysv/linux/Makefile [$(subdir)=misc] (sysdep_headers):
Add sys/quota.h.
[$(subdir)=inet] (sysdep_headers): Add new network header.
* sysdeps/unix/sysv/linux/netinet/udp.h: Add Linux specific changes.
* inet/netinet/ip.h: Move to sysdeps/generic.
* inet/netinet/tcp.h: Likewise.
* sysdeps/generic/netinet/ip.h: Moved to here from inet/netinet.
* sysdeps/generic/netinet/tcp.h: Likewise.
1997-02-17 01:18 Ulrich Drepper <drepper@cygnus.com>
* misc/sys/syslog.h (prioritynames): Correct definition to use
braces where necessary.
(facilitynames): Likewise.
Patch by Ronald F. Guilmette <rfg@monkeys.com>.
Comment and beautify declarations.
1997-02-16 19:54 1997 Philip Blundell <Philip.Blundell@pobox.com>
* inet/Makefile (routines): Add in6_addr, getnameinfo.
* inet/getnameinfo.c: New file. Implementation of getnameinfo()
by Craig Metz.
* inet/in6_addr.c: New file. IPv6 addressing constants.
* posix/Makefile (routines): Add gai_strerror.
* resolv/netdb.h: Add more constants for IPv6 basic API.
* sysdeps/posix/gai_strerror.c: New file.
* sysdeps/stub/gai_strerror.c New file.
* sysdeps/unix/sysv/linux/netinet/in.h: Add definitions for IPv6
basic API.
* sysdeps/posix/getaddrinfo.c: Update from latest version by
Craig Metz and use reentrant getXXbyYY functions.
1997-02-15 14:32 Andreas Jaeger <aj@arthur.pfalz.de>
* argp/argp.h: Declare argp_program_version as const char.
* argp/argp-test.c: Likewise
* stdlib/testrand.c (main): Declare main prototype.
* stdlib/testdiv.c (main): Likewise.
* string/testcopy.c (main): Likewise.
* string/test-ffs.c (main): Likewise.
* time/test_time.c (main): Likewise.
* locale/duplocale.c (__duplocale): Return result.
1997-02-16 03:54 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/unix/sysv/linux/netinet/in.h: Declare bindresvport.
Reported by fabsoft@fabserver1.zarm.uni-bremen.de.
* nss/nss.h: Remove declaration of __nss_shlib_revision.
* nss/nsswitch.c: Don't use NSS_SHLIB_VERSION macro.
1997-02-16 03:48 Thorsten Kukuk <kukuk@weber.uni-paderborn.de>
* nis/nss_nis/nis-ethers.c (_nss_nis_getethernam_r): Rename to
_nss_nis_gethostton_r.
(_nss_nis_getetherbyaddr_r): Rename to _nss_nis_getntohost_r.
1997-02-15 22:37 Andy Berkheimer <andy@tho.org>
* resolv/gethnamaddr.c (gethostbyname2): Test for ':' in name before
trying to resolv name as numeric IPv6 address.
* nss/digits_dots.c: Likewise.
Sat Feb 15 04:51:08 1997 Ulrich Drepper <drepper@cygnus.com>
* locale/setlocale.c (setlocale): Don't try to be clever about
unused locales. When the existence of the locale files isn't
tested the result of setlocale might be different.
1997-02-15 03:34 Ulrich Drepper <drepper@cygnus.com>
* locale/setlocale.c (setlocale): Don't increment usage_count of
new locale if it already has the value MAX_USAGE_COUNT (it might
be the C locale data which is read-only).
1997-02-13 11:44 Andreas Jaeger <aj@arthur.pfalz.de>
* stdlib/qsort.c: Add prototype for _quicksort.
* stdlib/msort.c (qsort): Correct prototype for _quicksort.
* sysdeps/i386/Makefile (CFLAGS-rtld.c): Change to prevent warning
from dl-machine.h.
1997-02-13 18:18 Marcus G. Daniels <marcus@sysc.pdx.edu>
* sysdeps/generic/dl-cache.c: Don't hardwire name of cache file.
Allow user to overwrite it.
1997-02-13 17:55 Ulrich Drepper <drepper@cygnus.com>
* libio/_G_config.h: Make sure win_t is also defined for old gcc
versions. Reported by Andreas Jaeger.
1997-02-13 11:44 Andreas Jaeger <aj@arthur.pfalz.de>
* db/btree/bt_split.c (bt_psplit): Fix typo in change of
1997-02-12.
* time/tzfile.c (__tzfile_read): Change comment to follow
change of 1997-02-12.
Thu Dec 19 23:28:33 1996 Ulrich Drepper <drepper@cygnus.com>
* resolv/resolv.h: Update from BIND 4.9.5-P1.
* resolv/res_comp.c: Likewise.
* resolv/res_debug.c: Likewise.
* resolv/Banner: Update version number.
Thu Dec 19 20:58:53 1996 Ulrich Drepper <drepper@cygnus.com>
* elf/dlfcn.h: Add extern "C" wrapper.
* io/utime.h: Don't define NULL since this isn't allowed in POSIX.
* io/sys/stat.h: Declare `lstat' only if __USE_BSD ||
__USE_XOPEN_EXTENDED.
* locale/locale.h: Define NULL.
* math/math.c: Don't include <errno.h> to define math errors.
* stdlib/stdlib.h: Likewise.
* posix/unistd.h: Don't declare environ.
* posix/sys/utsname.h (struct utsname): Declare member domainname
as __domainname is !__USE_GNU.
* signal/signal.h: Declare size_t only if __USE_BSD ||
__USE_XOPEN_EXTENDED.
* stdio/stdio.h: Don't declare cuserid when __USE_POSIX, but
instead when __USE_XOPEN.
* string/string.h: Define strndup only if __USE_GNU.
* sysdeps/unix/sysv/linux/clock.c: New file.
* sysdeps/unix/sysv/linux/timebits.h: Define CLOCKS_PER_SEC as
1000000 per X/Open standard.
* features.h: Add code to recognize _POSIX_C_SOURCE value 199309.
Define __USE_POSIX199309.
* posix/unistd.h: Declare fdatasync only if __USE_POSIX199309.
* time/time.c: Declare nanosleep only if __USE_POSIX199309.
Patches by Rdiger Helsch <rh@unifix.de>.
* locale/locale.h: Add declaration of newlocale and freelocale.
* new-malloc/Makefile (distibute): Add mtrace.awk.
(dist-routines): Add mcheck and mtrace.
(install-lib, non-lib.a): Define as libmcheck.a.
* new-malloc/malloc.h: Add declaration of __malloc_initialized.
* new-malloc/mcheck.c: New file.
* new-malloc/mcheck.h: New file.
* new-malloc/mtrace.c: New file.
* new-malloc/mtrace.awk: New file.
* posix/unistd.h: Correct prototype for usleep.
* sysdeps/unix/bsd/usleep.c: De-ANSI-declfy. Correct return type.
* sysdeps/unix/sysv/linux/usleep.c: Real implementation based on
nanosleep.
* signal/signal.h: Change protoype of __sigpause to take two
arguments. Remove prototype for sigpause. Add two different
macros named sigpause selected when __USE_BSD or __USE_XOPEN
are defined. This is necessary since the old BSD definition
of theis function collides with the X/Open definition.
* sysdeps/posix/sigpause.c: Change function definition to also
fit X/Open definition.
* sysdeps/libm-i387/e_exp.S: Make sure stack is empty when the
function is left.
* sysdeps/libm-i387/e_expl.S: Likewise.
Patch by HJ Lu.
1996-12-17 Paul Eggert <eggert@twinsun.com>
* many, many files: Spelling corrections.
* catgets/catgetsinfo.h (mmapped):
Renamed from mmaped (in struct catalog_info.status).
* mach/err_kern.sub (err_codes_unix), string/stratcliff.c (main):
Fix spelling in message.
* po/libc.pot: Fix spelling in message for `zic'; this anticipates
a fix in the tzcode distribution.
Wed Dec 18 15:48:02 1996 Ulrich Drepper <drepper@cygnus.com>
* time/strftime.c: Implement ^ flag to cause output be converted
to use upper case characters.
* time/zic.c: Update from ADO tzcode1996n.
Wed Dec 18 14:29:24 1996 Erik Naggum <erik@naggum.no>
* time/strftime.c (add): Don't change global `i' until all is over.
Define NULL is not already defined.
Tue Dec 17 09:49:03 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* libio/iovsprintf.c (_IO_vsprintf): Change `&sf' to `&sf._sbf._f'
to avoid the need for a cast.
* libio/iovsscanf.c (_IO_vsscanf): Likewise.
* sunrpc/rpc/xdr.h: Add prototype for xdr_free.