Files
integration/luprex/core/cpp/two-mallocs.cpp

65 lines
1.6 KiB
C++

// We only use a custom allocator on linux (for now)
// The allocator we chose is 'dlmalloc' (doug lea's malloc).
// It's a good allocator for single-threaded programs.
// It needs to be configured by setting a bunch of defines.
//
#ifdef __linux__
// We need this to define dlmalloc, not malloc.
#define USE_DL_PREFIX 1
// We don't need mspaces.
#define ONLY_MSPACES 0
#define MSPACES 0
// We don't need mallinfo
#define NO_MALLINFO 1
// We don't need dlmalloc_inspect_all
#define MALLOC_INSPECT_ALL 0
// We don't need dlmalloc_stats.
#define NO_MALLOC_STATS 1
// Disable locking. The entire engine is single-threaded.
#define USE_LOCKS 0
// For now, we'll let the allocator use mmap to get memory.
// It's not clear if this is going to be deterministic.
#define HAVE_MMAP 1
// One way to force determinism would be to emulate sbrk
// using mmap and mremap, always putting the heap at a fixed
// address. For now, we're not doing that, we're just
// using mmap and relying on that being deterministic (we hope).
#define HAVE_MORECORE 0
#define MORECORE emulate_sbrk
// The properties of mmap under linux
#define MMAP_CLEARS 1
#define HAVE_MREMAP 1
// Don't generate random seeds, or time-based seeds.
#define USE_DEV_RANDOM 0
#define LACKS_TIME_H 1
#include "dlmalloc/dlmalloc.c"
#endif
int dlmalloc_hash() {
void *blocks[15];
int hash = 0;
for (int i = 0; i < 15; i++) {
void *blk = dlmalloc(1 << i);
blocks[i] = blk;
hash = (hash * 17) + (int)(intptr_t)(blk);
}
for (int i = 0; i < 15; i++) {
dlfree(blocks[i]);
}
return (hash & 0x7FFFFFFF) | (0x40000000);
}