| 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 |