Skip to content

Commit

Permalink
Use __heap_base by dlmalloc (WebAssembly#114)
Browse files Browse the repository at this point in the history
* add explicit allocator initialization

* move init to a better place

* fix warnings

* add __wasilibc_try_init_allocator

* move initialization to dlmalloc()

* fix typos

* fix identations

* follow style guide

* review changes
  • Loading branch information
mikevoronov authored and sunfishcode committed Nov 5, 2019
1 parent a94d2d0 commit a214f1c
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 0 deletions.
48 changes: 48 additions & 0 deletions dlmalloc/src/malloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -4560,6 +4560,11 @@ static void* tmalloc_small(mstate m, size_t nb) {

#if !ONLY_MSPACES

#if __wasilibc_unmodified_upstream // Forward declaration of try_init_allocator.
#else
static void try_init_allocator(void);
#endif

void* dlmalloc(size_t bytes) {
/*
Basic algorithm:
Expand Down Expand Up @@ -4588,6 +4593,13 @@ void* dlmalloc(size_t bytes) {
ensure_initialization(); /* initialize in sys_alloc if not using locks */
#endif

#if __wasilibc_unmodified_upstream // Try to initialize the allocator.
#else
if (!is_initialized(gm)) {
try_init_allocator();
}
#endif

if (!PREACTION(gm)) {
void* mem;
size_t nb;
Expand Down Expand Up @@ -5197,6 +5209,42 @@ static void internal_inspect_all(mstate m,
}
#endif /* MALLOC_INSPECT_ALL */

#ifdef __wasilibc_unmodified_upstream // Define a function that initializes the initial state of dlmalloc
#else
/* ------------------ Exported try_init_allocator -------------------- */

/* Symbol marking the end of data, bss and explicit stack, provided by wasm-ld. */
extern unsigned char __heap_base;

/* Initialize the initial state of dlmalloc to be able to use free memory between __heap_base and initial. */
static void try_init_allocator(void) {
/* Check that it is a first-time initialization. */
assert(!is_initialized(gm));

char *base = (char *)&__heap_base;
/* Calls sbrk(0) that returns the initial memory position. */
char *init = (char *)CALL_MORECORE(0);
int initial_heap_size = init - base;

/* Check that initial heap is long enough to serve a minimal allocation request. */
if (initial_heap_size <= MIN_CHUNK_SIZE + TOP_FOOT_SIZE + MALLOC_ALIGNMENT) {
return;
}

/* Initialize mstate. */
ensure_initialization();

/* Initialize the dlmalloc internal state. */
gm->least_addr = base;
gm->seg.base = base;
gm->seg.size = initial_heap_size;
gm->magic = mparams.magic;
gm->release_checks = MAX_RELEASE_CHECK_RATE;
init_bins(gm);
init_top(gm, (mchunkptr)base, initial_heap_size - TOP_FOOT_SIZE);
}
#endif

/* ------------------ Exported realloc, memalign, etc -------------------- */

#if !ONLY_MSPACES
Expand Down
1 change: 1 addition & 0 deletions expected/wasm32-wasi/undefined-symbols.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ __floatsitf
__floatunsitf
__getf2
__gttf2
__heap_base
__letf2
__lttf2
__netf2
Expand Down

0 comments on commit a214f1c

Please sign in to comment.