56 lines
1.9 KiB
Text
56 lines
1.9 KiB
Text
Notes about the Chrome memory allocator.
|
|
|
|
Background
|
|
----------
|
|
We use this library as a generic way to fork into any of several allocators.
|
|
Currently we can, at runtime, switch between:
|
|
the default windows allocator
|
|
the windows low-fragmentation-heap
|
|
tcmalloc
|
|
|
|
The mechanism for hooking LIBCMT in windows is rather tricky. The core
|
|
problem is that by default, the windows library does not declare malloc and
|
|
free as weak symbols. Because of this, they cannot be overriden. To work
|
|
around this, we start with the LIBCMT.LIB, and manually remove all allocator
|
|
related functions from it using the visual studio library tool. Once removed,
|
|
we can now link against the library and provide custom versions of the
|
|
allocator related functionality.
|
|
|
|
|
|
Source code
|
|
-----------
|
|
This directory contains just the allocator (i.e. shim) layer that switches
|
|
between the different underlying memory allocation implementations.
|
|
|
|
The tcmalloc library originates outside of Chromium and exists in
|
|
../../third_party/tcmalloc (currently, the actual location is defined in the
|
|
allocator.gyp file). The third party sources use a vendor-branch SCM pattern to
|
|
track Chromium-specific changes independently from upstream changes.
|
|
|
|
The general intent is to push local changes upstream so that over
|
|
time we no longer need any forked files.
|
|
|
|
|
|
Adding a new allocator
|
|
----------------------
|
|
Adding a new allocator requires definition of the following five functions:
|
|
|
|
extern "C" {
|
|
bool init();
|
|
void* malloc(size_t s);
|
|
void* realloc(void* p, size_t s);
|
|
void free(void* s);
|
|
size_t msize(void* p);
|
|
}
|
|
|
|
All other allocation related functions (new/delete/calloc/etc) have been
|
|
implemented generically to work across all allocators.
|
|
|
|
|
|
Usage
|
|
-----
|
|
You can use the different allocators by setting the environment variable
|
|
CHROME_ALLOCATOR to:
|
|
"tcmalloc" - TC Malloc (default)
|
|
"winheap" - Windows default heap
|
|
"winlfh" - Windows Low-Fragmentation heap
|