Commit Graph

588 Commits

Author SHA1 Message Date
Todd Lipcon
db98aac55a Add a central free list for kMaxPages-sized spans
Previously, the central free list with index '0' was always unused,
since freelist index 'i' tracked spans of length 'i' and there are no
spans of length 0. This meant that there was no freelist for spans of
length 'kMaxPages'. In the default configuration, this corresponds to
1MB, which is a relatively common allocation size in a lot of
applications.

This changes the free list indexing so that index 'i' tracks spans of
length 'i + 1', meaning that free list index 0 is now used and
freelist[kMaxPages - 1] tracks allocations of kMaxPages size (1MB by
default).

This also fixes the stats output to indicate '>128' for the large spans
stats rather than the incorrect '>255' which must have referred to a
historical value of kMaxPages.

No new tests are added since this code is covered by existing tests.
2018-03-17 09:46:28 -07:00
Aliaksey Kandratsenka
d7be938560 implement more robust detection of sized delete support
As reported in issue #954, osx clang compiler is able to optimize our
previous detection away while not really having runtime support for
sized delete. So this time we use AC_LINK_IFELSE and more robust code
to prevent compiler from optimizing away sized delete call. This
should reliably catch "bad" compilers.

Special thanks to Alexey Serbin for reporting the issue, suggesting a
fix and verifying it.

Fixes issue #954.
2018-03-04 23:41:26 -08:00
Aliaksey Kandratsenka
f1d3fe4a21 refactored handling of reverse span set iterator for correctness
I.e. no more questionable memcpy and we run iterator's destructor when
we remove span from SpanSet.
2018-02-25 15:25:16 -08:00
Todd Lipcon
59c77be0fa Update docs for central page heap to reflect tree 2018-02-25 15:25:16 -08:00
Aliaksey Kandratsenka
06c9414ec4 Implemented O(log n) searching among large spans
This is implemented via std::set with custom STL allocator that
delegates to PageHeapAllocator. Free large spans are not linked
together via linked list, but inserted into std::set. Spans also store
iterators to std::set positions pointing to them. So that removing
span from set is fast too.

Patch implemented by Aliaksey Kandratsenka and Todd Lipcon based on
earlier research and experimentation by James Golick.

Addresses issue #535

[alkondratenko@gmail.com: added Todd's fix for building on OSX]
[alkondratenko@gmail.com: removed unnecessary Span constructor]
[alkondratenko@gmail.com: added const for SpanSet comparator]
[alkondratenko@gmail.com: added operator != for STLPageHeapAllocator]
2018-02-25 15:24:17 -08:00
Ishan Arora
a42e44738a typo in docs/tcmalloc.html 2018-01-09 01:35:43 +05:30
Aliaksey Kandratsenka
71bf09aabe bumped version to 2.6.3 2017-12-09 09:59:37 -08:00
Aliaksey Kandratsenka
0bccb5e658 fix malloc fast path for patched windows functions
malloc_fast_path now receives oom function instead of full allocation
function and windows/patch_function.cc wasn't updated until now. It
caused assertion failures as reported in issue #944.
2017-12-09 09:06:52 -08:00
Stephan Zuercher
8b1d13c631 configure.ac: use link check for std::align_val_t 2017-12-09 09:06:52 -08:00
Stephan Zuercher
36ab068baa configure.ac: better test for -faligned-new
XCode 9 provides only partial support for aligned new/delete when -faligned-new
is specified. Require successful linking to enable aligned new/delete.
2017-12-09 09:06:52 -08:00
Aliaksey Kandratsenka
6a4b079997 bumped version to 2.6.2 2017-11-30 18:19:17 +00:00
Aliaksey Kandratsenka
2291714518 implement fast-path for memalign/aligned_alloc/tc_new_aligned
We're taking advantage of "natural" alignedness of our size classes
and instead of previous loop over size classes looking for suitably
aligned size, we now directly compute right size. See align_size_up
function. And that gives us ability to use our existing malloc
fast-path to make memalign neat and fast in most common
cases. I.e. memalign/aligned_alloc now only tail calls and thus avoids
expensive prologue/epilogue and is almost as fast as regular malloc.
2017-11-30 18:14:14 +00:00
Aliaksey Kandratsenka
8b9728b023 add memalign benchmark to malloc_bench 2017-11-30 18:14:11 +00:00
Aliaksey Kandratsenka
79c91a9810 always define empty PERFTOOLS_NOTHROW
Because somehow clang still builds "this function will not throw" code
even with noexcept. Which breaks performance of
tc_malloc/tc_new_nothrow. The difference with throw() seems to be just
which function is called when unexpected exception happens.

So we work around this sillyness by simply dropping any exception
specification when compiling tcmalloc.
2017-11-29 21:44:52 +00:00
Aliaksey Kandratsenka
03da6afff5 unbreak throw declarations on operators new/delete
We now clearly separate PERFTOOLS_NOTHROW (used for tc_XXX functions)
and throw()/noexcept (used for operators we define).

The former is basically "nothrow() for our callers, nothing for
us". It is roughly equivalent of what glibc declares for malloc and
friends. If some exception-full C++ code calls such function it
doesn't have to bother setting up exception handling around such
call. Notably, it is still important for those functions to _not have
throw() declarations when we're building tcmalloc. Because C++ throw()
requires setting up handling of unexpected exceptions thrown from
under such functions which we don't want.

The later is necessary to have operators new/delete definitions have
"correct" exception specifications to calm down compiler
warnings. Particularly older clang versions warn if new/delete aren't
defined with correct exception specifications. Also this commit fixes
annoying gcc 7+ warning (and gnu++14 mode) that complains about
throw() being deprecated.
2017-11-29 21:44:49 +00:00
Aliaksey Kandratsenka
89fe59c831 Fix OOM handling in fast-path
Previous fast-path malloc implementation failed to arrange proper oom
handling for operator new. I.e. operator new is supposed to call new
handler and throw exception, which was not arranged in fast-path case.

Fixed code now passes pointer for oom function to
ThreadCache::FetchFromCentralCache which will call it in oom
condition. Test is added to verify correct behavior.

I've also updated some fast-path-related comments for more accuracy.
2017-11-29 21:44:49 +00:00
Aliaksey Kandratsenka
a29a0cf348 delete-trailing-whitespace on thread_cache.* 2017-11-29 20:50:55 +00:00
Aliaksey Kandratsenka
e6cd69bdec reintroduce aliasing for aligned delete
Without aliasing performance is likely to be at least partially
affected. There is still concern that aliasing between functions of
different signatures is not 100% safe. We now explicitly list of
architectures where aliasing is known to be safe.
2017-11-29 19:52:32 +00:00
Aliaksey Kandratsenka
fb30c3d435 fully disable aligned new on windows for now 2017-11-29 19:52:32 +00:00
Andrey Semashev
7efb3ecf37 Add support for C++17 operator new/delete for overaligned types.
- Add auto-detection of std::align_val_t presence to configure scripts. This
  indicates that the compiler supports C++17 operator new/delete overloads
  for overaligned types.

- Add auto-detection of -faligned-new compiler option that appeared in gcc 7.
  The option allows the compiler to generate calls to the new operators. It is
  needed for tests.

- Added overrides for the new operators. The overrides are enabled if the
  support for std::align_val_t has been detected. The implementation is mostly
  based on the infrastructure used by memalign, which had to be extended to
  support being used by C++ operators in addition to C functions. In particular,
  the debug version of the library has to distinguish memory allocated by
  memalign from that by operator new. The current implementation of sized
  overaligned delete operators do not make use of the supplied size argument
  except for the debug allocator because it is difficult to calculate the exact
  allocation size that was used to allocate memory with alignment. This can be
  done in the future.

- Removed forward declaration of std::nothrow_t. This was not portable as
  the standard library is not required to provide nothrow_t directly in
  namespace std (it could use e.g. an inline namespace within std). The <new>
  header needs to be included for std::align_val_t anyway.

- Fixed operator delete[] implementation in libc_override_redefine.h.

- Moved TC_ALIAS definition to the beginning of the file in tcmalloc.cc so that
  the macro is defined before its first use in nallocx.

- Added tests to verify the added operators.

[alkondratenko@gmail.com: fixed couple minor warnings, and some
whitespace change]
[alkondratenko@gmail.com: removed addition of TC_ALIAS in debug allocator]
Signed-off-by: Aliaksey Kandratsenka <alkondratenko@gmail.com>
2017-11-29 19:51:42 +00:00
Andrew Morrow
7a6e25f3b1 Add new statistics for the PageHeap
[alkondratenko@gmail.com: addressed init order mismatch warning]
Signed-off-by: Aliaksey Kandratsenka <alkondratenko@gmail.com>
2017-11-28 14:19:08 +00:00
Jianbo Yang
6e3a702fb9 Fix data race setting size_left_ in ThreadCache::SetMaxSize
This commit is to fix the data race in ThreadCache::SetMaxSize.
ThreadCache::size_left_ is removed and ThreadCache::size_ is
added. ThreadCache::size_left_ was introduced for optimization.
It is updated in several functions of ThreadCache, including the
ThreadCache::SetMaxSize. But thread A can update size_left_ of
thread B via SetMaxSize without protection or synchronization.

There should not be data race around ThreadCache::size_, for it
isn't accessed by multi threads.

The optimization of tail-call in tc_{malloc, new, free} is kept
and no other logics are affected.
2017-10-17 01:09:18 +08:00
cs-lee
235471f965 fix memory leak in Symbolize function
[alkondratenko@gmail.com: reworded commit message]
Signed-off-by: Aliaksey Kandratsenka <alkondratenko@gmail.com>
2017-09-23 15:12:03 -07:00
cs-lee
47efdd60f5 Added mising va_end() in TracePrintf function
Normally the va_end function does not do anything,
but it should be called because some platforms need it.

[alkondratenko@gmail.com: reworded commit message]
Signed-off-by: Aliaksey Kandratsenka <alkondratenko@gmail.com>
2017-09-23 15:11:24 -07:00
Vladimir
497b60ef0f Implemented GetProgramInvocationName on FreeBSD
Few lines of code was taken from
/usr/src/contrib/libexecinfo/backtrace.c

[alkondratenko@gmail.com: updated commit message
Signed-off-by: Aliaksey Kandratsenka <alkondratenko@gmail.com>
2017-09-23 15:01:07 -07:00
Aliaksey Kandratsenka
ac072a3fc7 Revert "Ignore current_instance heap allocation when leak sanitizer is enabled"
This reverts commit 70a35422b5.
2017-09-23 14:55:33 -07:00
Aliaksey Kandratsenka
fb5987d579 Revert "Ensure that lsan flags are appended on all necessary targets"
This reverts commit a3bf61ca81.
2017-09-23 14:55:20 -07:00
Aliaksey Kandratsenka
5815f02105 Use safe getenv for setting up backtrace capturing method
This code runs very early, so using special "early" version of getenv
is reasonable. It should fix issue #912.
2017-09-23 11:35:58 -07:00
Dorin Lazăr
aab4277311 Fixed LTO warning about the mismatch between return values for ProfilingIsEnabledForAllThreads() 2017-09-23 11:19:34 -07:00
Aliaksey Kandratsenka
d406f22853 implement support for C11 aligned_alloc
Just like glibc does, we simply alias it to memalign.
2017-09-16 20:38:44 -07:00
Piotr Sikora
92a27e41a1 Fix build on macOS.
Fixes #910.

Signed-off-by: Piotr Sikora <piotrsikora@google.com>
2017-08-21 15:06:23 -07:00
Khem Raj
e033431e5a include fcntl.h for loff_t definition
Fixes
linux_syscall_support.h:2641:26: error: 'loff_t' has not been declared

Signed-off-by: Khem Raj <raj.khem@gmail.com>
2017-07-16 19:33:25 -07:00
Khem Raj
e41bc41404 Use ucontext_t instead of struct ucontext
Newer glibc has dropped the ucontext tag from exposing

Signed-off-by: Khem Raj <raj.khem@gmail.com>
2017-07-16 15:57:34 -07:00
Aliaksey Kandratsenka
bf840dec04 bumped version to 2.6.1 2017-07-09 14:55:33 -07:00
Romain Geissler
2d220c7e26 Replace "throw()" by "PERFTOOLS_NOTHROW"
Automatically done with:
sed -e 's/\<throw[[:space:]]*([[:space:]]*)/PERFTOOLS_NOTHROW/g' -i
$(git grep -l 'throw[[:space:]]*([[:space:]]*)')

[alkondratenko@gmail.com: updated to define empty PERFTOOLS_NOTHROW
only on pre-c++11 standards]
2017-07-09 14:10:06 -07:00
Romain Geissler
c4de73c0e6 Add PERFTOOLS_THROW where necessary (as detected by GCC). 2017-07-08 16:22:27 -07:00
Romain Geissler
e5fbd0e24e Rename PERFTOOLS_THROW into PERFTOOLS_NOTHROW.
Automatically done with:
sed -e 's/\<PERFTOOLS_THROW\>/PERFTOOLS_NOTHROW/g' -i $(git grep -l PERFTOOLS_THROW)
2017-07-08 16:22:27 -07:00
Aliaksey Kandratsenka
eeb7b84c20 Register tcmalloc atfork handler as early as possible
This is what other mallocs do (glibc malloc and jemalloc). The idea is
malloc is usually initialized very eary. So if we register atfork
handler at that time, we're likely to be first. And that makes our
atfork handler a bit safer, since there is much less chance of some
other library installing their "take all locks" handler first and
having fork take malloc lock before library's lock and deadlocking.

This should address issue #904.
2017-07-08 16:08:29 -07:00
Aliaksey Kandratsenka
208c26caef Add initial syscall support for mips64 32-bit ABI
This applies patch by Adhemerval Zanella from
https://github.com/gperftools/gperftools/issues/845.

Only malloc (i.e. tcmalloc_minimal) was tested to work so far.
2017-07-08 13:34:41 -07:00
Francis Ricci
a3bf61ca81 Ensure that lsan flags are appended on all necessary targets 2017-07-08 13:33:30 -07:00
Aliaksey Kandratsenka
97646a1932 Add missing NEWS entry for recent 2.6 release
Somehow I managed to miss this last commit in 2.6 release. So lets add
it now even if it is too late.
2017-07-04 21:02:34 -07:00
Aliaksey Kandratsenka
4be05e43a1 bumped version up to 2.6 2017-07-04 20:35:25 -07:00
Francis Ricci
70a35422b5 Ignore current_instance heap allocation when leak sanitizer is enabled
Without this patch, any user program that enables LeakSanitizer will
see a leak from tcmalloc. Add a weak hook to __lsan_ignore_object,
so that if LeakSanitizer is enabled, the allocation can be ignored.
2017-07-04 20:24:47 -07:00
Aliaksey Kandratsenka
6eca6c64fa Revert "issue-654: [pprof] handle split text segments"
This reverts commit 8c3dc52fcf.

People have reported issues with this so lets stay safe and use older
even if less powerful code.
2017-07-01 18:48:58 -07:00
KernelMaker
a495969cb6 update the prev_class_size in each loop, or the min_object_size of tcmalloc.thread will always be 1 when calling GetFreeListSizes 2017-05-29 15:05:55 -07:00
Kim Gräsman
163224d8af Document HEAPPROFILESIGNAL environment variable 2017-05-29 15:04:00 -07:00
Aliaksey Kandratsenka
5ac82ec5b9 added stacktrace capturing benchmark 2017-05-29 14:57:13 -07:00
Aliaksey Kandratsenka
c571ae2fc9 2.6rc4 2017-05-22 19:04:20 -07:00
Aliaksey Kandratsenka
f2bae51e7e Revert "Revert "disable dynamic sized delete support by default""
This reverts commit b82d89cb7c8781a6028f6f5959cabdc5a273aec3.

Dynamic sized delete support relies on ifunc handler being able to
look up environment variable. The issue is, when stuff is linked with
-z now linker flags, all relocations are performed early. And sadly
ifunc relocations are not treated specially. So when ifunc handler
runs, it cannot rely on any dynamic relocations at all, otherwise
crash is real possibility. So we cannot afford doing it until (and if)
ifunc is fixed.

This was brought to my attention by Fedora people at
https://bugzilla.redhat.com/show_bug.cgi?id=1452813
2017-05-22 18:58:15 -07:00
Aliaksey Kandratsenka
6426c0cc80 2.6rc3 2017-05-22 03:08:30 -07:00