Notes about the Chrome port of tcmalloc & jemalloc. 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 ----------- Everything within the directory tcmalloc/tcmalloc is pulled directly from the google-perftools repository. For the most part, tcmalloc is a stock build from there. We have forked a few files. We always push our changes upstream, so over time the forked files should disappear. Currently forked files include: page_heap.cc port.cc system-alloc.cc system-alloc.h tcmalloc.cc 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 Local modifications ------------------- jemalloc has been modified slightly to work within the Chromium build.