Commit graph

22 commits

Author SHA1 Message Date
Rich Felker
b8ccf8e46b page-align initial brk value used by malloc in shared libc
this change fixes an obscure issue with some nonstandard kernels,
where the initial brk syscall returns a pointer just past the end of
bss rather than the beginning of a new page. in that case, the dynamic
linker has already reclaimed the space between the end of bss and the
page end for use by malloc, and memory corruption (allocating the same
memory twice) will occur when malloc again claims it on the first call
to brk.
2012-12-07 22:33:11 -05:00
Rich Felker
2ad9cf52eb fix invalid read in aligned_alloc
in case of mmap-obtained chunks, end points past the end of the
mapping and reading it may fault. since the value is not needed until
after the conditional, move the access to prevent invalid reads.
2012-12-06 21:12:28 -05:00
Rich Felker
afd209deb7 workaround gcc got-register-reload performance problems in malloc
with this patch, the malloc in libc.so built with -Os is nearly the
same speed as the one built with -O3. thus it solves the performance
regression that resulted from removing the forced -O3 when building
libc.so; now libc.so can be both small and fast.
2012-09-14 23:52:51 -04:00
Rich Felker
9bff7c133e implement "low hanging fruit" from C11
based on Gregor's patch sent to the list. includes:
- stdalign.h
- removing gets in C11 mode
- adding aligned_alloc and adjusting other functions to use it
- adding 'x' flag to fopen for exclusive mode
2012-08-25 23:15:13 -04:00
Rich Felker
4750cf4202 ditch the priority inheritance locks; use malloc's version of lock
i did some testing trying to switch malloc to use the new internal
lock with priority inheritance, and my malloc contention test got
20-100 times slower. if priority inheritance futexes are this slow,
it's simply too high a price to pay for avoiding priority inversion.
maybe we can consider them somewhere down the road once the kernel
folks get their act together on this (and perferably don't link it to
glibc's inefficient lock API)...

as such, i've switch __lock to use malloc's implementation of
lightweight locks, and updated all the users of the code to use an
array with a waiter count for their locks. this should give optimal
performance in the vast majority of cases, and it's simple.

malloc is still using its own internal copy of the lock code because
it seems to yield measurably better performance with -O3 when it's
inlined (20% or more difference in the contention stress test).
2012-04-24 16:32:23 -04:00
Rich Felker
e5d78fe8df fix issue with excessive mremap syscalls on realloc
CHUNK_SIZE macro was defined incorrectly and shaving off at least one
significant bit in the size of mmapped chunks, resulting in the test
for oldlen==newlen always failing and incurring a syscall. fortunately
i don't think this issue caused any other observable behavior; the
definition worked correctly for all non-mmapped chunks where its
correctness matters more, since their lengths are always multiples of
the alignment.
2011-11-16 23:59:28 -05:00
Rich Felker
1c8bead345 use new a_crash() asm to optimize double-free handler.
gcc generates extremely bad code (7 byte immediate mov) for the old
null pointer write approach. it should be generating something like
"xor %eax,%eax ; mov %al,(%eax)". in any case, using a dedicated
crashing opcode accomplishes the same thing in one byte.
2011-08-23 09:43:45 -04:00
Rich Felker
ce7c6341d3 simplify and improve double-free check
a valid mmapped block will have an even (actually aligned) "extra"
field, whereas a freed chunk on the heap will always have an in-use
neighbor.

this fixes a potential bug if mmap ever allocated memory below the
main program/brk (in which case it would be wrongly-detected as a
double-free by the old code) and allows the double-free check to work
for donated memory outside of the brk area (or, in the future,
secondary heap zones if support for their creation is added).
2011-08-15 01:59:15 -04:00
Rich Felker
f9ed11f3e1 posix_memalign should fail if size is not a multiple of sizeof(void *) 2011-06-29 19:26:30 -04:00
Rich Felker
5d0965cb56 eliminate OOB array hacks in malloc 2011-06-26 16:12:43 -04:00
Rich Felker
2afebbbcd1 malloc: cast size down to int in bin_index functions
even if size_t was 32-bit already, the fact that the value was
unsigned and that gcc is too stupid to figure out it would be positive
as a signed quantity (due to the immediately-prior arithmetic and
conditionals) results in gcc compiling the integer-to-float conversion
as zero extension to 64 bits followed by an "fildll" (64 bit)
instruction rather than a simple "fildl" (32 bit) instruction on x86.
reportedly fildll is very slow on certain p4-class machines; even if
not, the new code is slightly smaller.
2011-06-12 10:53:42 -04:00
Rich Felker
71a80c5767 use volatile pointers for intentional-crash code. 2011-06-06 18:10:43 -04:00
Rich Felker
b052f13cd1 namespace fixes for sys/mman.h 2011-04-20 15:55:58 -04:00
Rich Felker
b761bd19aa fix rare but nasty under-allocation bug in malloc with large requests
the bug appeared only with requests roughly 2*sizeof(size_t) to
4*sizeof(size_t) bytes smaller than a multiple of the page size, and
only for requests large enough to be serviced by mmap instead of the
normal heap. it was only ever observed on 64-bit machines but
presumably could also affect 32-bit (albeit with a smaller window of
opportunity).
2011-04-04 17:26:41 -04:00
Rich Felker
bf8785825a avoid over-allocation of brk on first malloc
if init_malloc returns positive (successful first init), malloc will
retry getting a chunk from the free bins rather than expanding the
heap again. also pass init_malloc a hint for the size of the initial
allocation.
2011-04-01 23:07:03 -04:00
Rich Felker
620a134638 rename __simple_malloc.c to lite_malloc.c - yes this affects behavior!
why does this affect behavior? well, the linker seems to traverse
archive files starting from its current position when resolving
symbols. since calloc.c comes alphabetically (and thus in sequence in
the archive file) between __simple_malloc.c and malloc.c, attempts to
resolve the "malloc" symbol for use by calloc.c were pulling in the
full malloc.c implementation rather than the __simple_malloc.c
implementation.

as of now, lite_malloc.c and malloc.c are adjacent in the archive and
in the correct order, so malloc.c should never be used to resolve
"malloc" unless it's already needed to resolve another symbol ("free"
or "realloc").
2011-03-30 09:29:49 -04:00
Rich Felker
0958200166 very cheap double-free checks in malloc 2011-03-23 13:24:00 -04:00
Rich Felker
aa398f56fa global cleanup to use the new syscall interface 2011-03-20 00:16:43 -04:00
Rich Felker
26031da0f8 make malloc(0) return unique pointers rather than NULL
this change is made with some reluctance, but i think it's for the
best. correct programs must handle either behavior, so there is little
advantage to having malloc(0) return NULL. and i managed to actually
make the malloc code slightly smaller with this change.
2011-02-20 16:16:33 -05:00
Rich Felker
598a0147cd fix simple_malloc malloc(0) behavior not to return non-unique pointers 2011-02-20 16:12:09 -05:00
Rich Felker
a23baf586a fix simple_malloc size restrictions
do not allow allocations that overflow ptrdiff_t; fix some overflow
checks that were not quite right but didn't matter due to address
layout implementation.
2011-02-20 16:10:38 -05:00
Rich Felker
0b44a0315b initial check-in, version 0.5.0 2011-02-12 00:22:29 -05:00