1e26d35193
The malloc tcache added in 2.26 will leak all of the elements remaining in the cache and the cache structure itself when a thread exits. The defect is that we do not set tcache_shutting_down early enough, and the thread simply recreates the tcache and places the elements back onto a new tcache which is subsequently lost as the thread exits (unfreed memory). The fix is relatively simple, move the setting of tcache_shutting_down earlier in tcache_thread_freeres. We add a test case which uses mallinfo and some heuristics to look for unaccounted for memory usage between the start and end of a thread start/join loop. It is very reliable at detecting that there is a leak given the number of iterations. Without the fix the test will consume 122MiB of leaked memory. |
||
---|---|---|
.. | ||
alloc_buffer_alloc_array.c | ||
alloc_buffer_allocate.c | ||
alloc_buffer_copy_bytes.c | ||
alloc_buffer_copy_string.c | ||
alloc_buffer_create_failure.c | ||
arena.c | ||
Depend | ||
dynarray_at_failure.c | ||
dynarray_emplace_enlarge.c | ||
dynarray_finalize.c | ||
dynarray_resize_clear.c | ||
dynarray_resize.c | ||
dynarray-skeleton.c | ||
dynarray.h | ||
hooks.c | ||
Makefile | ||
malloc-hooks.h | ||
malloc-internal.h | ||
malloc.c | ||
malloc.h | ||
mallocbug.c | ||
mcheck-init.c | ||
mcheck.c | ||
mcheck.h | ||
memusage.c | ||
memusage.sh | ||
memusagestat.c | ||
morecore.c | ||
mtrace.c | ||
mtrace.pl | ||
obstack.c | ||
obstack.h | ||
reallocarray.c | ||
scratch_buffer_grow_preserve.c | ||
scratch_buffer_grow.c | ||
scratch_buffer_set_array_size.c | ||
set-freeres.c | ||
thread-freeres.c | ||
tst-alloc_buffer.c | ||
tst-calloc.c | ||
tst-dynarray-at-fail.c | ||
tst-dynarray-fail.c | ||
tst-dynarray-shared.h | ||
tst-dynarray.c | ||
tst-interpose-aux-nothread.c | ||
tst-interpose-aux-thread.c | ||
tst-interpose-aux.c | ||
tst-interpose-aux.h | ||
tst-interpose-nothread.c | ||
tst-interpose-skeleton.c | ||
tst-interpose-static-nothread.c | ||
tst-interpose-static-thread.c | ||
tst-interpose-thread.c | ||
tst-malloc-backtrace.c | ||
tst-malloc-fork-deadlock.c | ||
tst-malloc-tcache-leak.c | ||
tst-malloc-thread-exit.c | ||
tst-malloc-thread-fail.c | ||
tst-malloc-usable-static-tunables.c | ||
tst-malloc-usable-static.c | ||
tst-malloc-usable-tunables.c | ||
tst-malloc-usable.c | ||
tst-malloc.c | ||
tst-mallocfork2.c | ||
tst-mallocfork.c | ||
tst-mallocstate.c | ||
tst-mallopt.c | ||
tst-mcheck.c | ||
tst-memalign.c | ||
tst-mtrace.c | ||
tst-mtrace.sh | ||
tst-obstack.c | ||
tst-posix_memalign.c | ||
tst-pvalloc.c | ||
tst-realloc.c | ||
tst-reallocarray.c | ||
tst-scratch_buffer.c | ||
tst-trim1.c | ||
tst-valloc.c | ||
Versions |