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