60 lines
2.1 KiB
Plaintext
60 lines
2.1 KiB
Plaintext
|
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
|
||
|
jemalloc (the heap used most notably within Mozilla Firefox)
|
||
|
|
||
|
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 and jemalloc libraries originate outside of Chromium
|
||
|
and exist in ../../third_party/tcmalloc and ../../third_party/jemalloc
|
||
|
(currently, the actual locations are 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)
|
||
|
"jemalloc" - JE Malloc
|
||
|
"winheap" - Windows default heap
|
||
|
"winlfh" - Windows Low-Fragmentation heap
|