mirror of git://sourceware.org/git/glibc.git
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. |
||
|---|---|---|
| .. | ||
| Depend | ||
| Makefile | ||
| Versions | ||
| 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 | ||
| dynarray-skeleton.c | ||
| dynarray.h | ||
| dynarray_at_failure.c | ||
| dynarray_emplace_enlarge.c | ||
| dynarray_finalize.c | ||
| dynarray_resize.c | ||
| dynarray_resize_clear.c | ||
| hooks.c | ||
| 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.c | ||
| scratch_buffer_grow_preserve.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-mallocfork.c | ||
| tst-mallocfork2.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 | ||