Blink roll 25b6bd3a7a131ffe68d809546ad1a20707915cdc:3a503f41ae42e5b79cfcd2ff10e65afde...
[chromium-blink-merge.git] / base / allocator / README
blobec8a707f4137063f005d4e2e02104ae888e85d78
1 Notes about the Chrome memory allocator.
3 Background
4 ----------
5 We use this library as a generic way to fork into any of several allocators.
6 Currently we can, at runtime, switch between:
7    the default windows allocator
8    the windows low-fragmentation-heap
9    tcmalloc
10    jemalloc (the heap used most notably within Mozilla Firefox)
12 The mechanism for hooking LIBCMT in windows is rather tricky.  The core
13 problem is that by default, the windows library does not declare malloc and
14 free as weak symbols.  Because of this, they cannot be overriden.  To work
15 around this, we start with the LIBCMT.LIB, and manually remove all allocator
16 related functions from it using the visual studio library tool.  Once removed,
17 we can now link against the library and provide custom versions of the 
18 allocator related functionality.
21 Source code
22 -----------
23 This directory contains just the allocator (i.e. shim) layer that switches
24 between the different underlying memory allocation implementations.
26 The tcmalloc and jemalloc libraries originate outside of Chromium
27 and exist in ../../third_party/tcmalloc and ../../third_party/jemalloc
28 (currently, the actual locations are defined in the allocator.gyp file).
29 The third party sources use a vendor-branch SCM pattern to track
30 Chromium-specific changes independently from upstream changes.
32 The general intent is to push local changes upstream so that over
33 time we no longer need any forked files.
36 Adding a new allocator
37 ----------------------
38 Adding a new allocator requires definition of the following five functions:
40   extern "C" {
41     bool init();
42     void* malloc(size_t s);
43     void* realloc(void* p, size_t s);
44     void free(void* s);
45     size_t msize(void* p);
46   }
48 All other allocation related functions (new/delete/calloc/etc) have been
49 implemented generically to work across all allocators.
52 Usage
53 -----
54 You can use the different allocators by setting the environment variable
55 CHROME_ALLOCATOR to:
56    "tcmalloc"  - TC Malloc (default)
57    "jemalloc"  - JE Malloc
58    "winheap"   - Windows default heap
59    "winlfh"    - Windows Low-Fragmentation heap