MCPcopy Create free account
hub / github.com/dcodeIO/webassembly / mspace_free

Function mspace_free

lib/dlmalloc/malloc.c:5609–5708  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

5607}
5608
5609void mspace_free(mspace msp, void* mem) {
5610 if (mem != 0) {
5611 mchunkptr p = mem2chunk(mem);
5612#if FOOTERS
5613 mstate fm = get_mstate_for(p);
5614 (void)msp; /* placate people compiling -Wunused */
5615#else /* FOOTERS */
5616 mstate fm = (mstate)msp;
5617#endif /* FOOTERS */
5618 if (!ok_magic(fm)) {
5619 USAGE_ERROR_ACTION(fm, p);
5620 return;
5621 }
5622 if (!PREACTION(fm)) {
5623 check_inuse_chunk(fm, p);
5624 if (RTCHECK(ok_address(fm, p) && ok_inuse(p))) {
5625 size_t psize = chunksize(p);
5626 mchunkptr next = chunk_plus_offset(p, psize);
5627 if (!pinuse(p)) {
5628 size_t prevsize = p->prev_foot;
5629 if (is_mmapped(p)) {
5630 psize += prevsize + MMAP_FOOT_PAD;
5631 if (CALL_MUNMAP((char*)p - prevsize, psize) == 0)
5632 fm->footprint -= psize;
5633 goto postaction;
5634 }
5635 else {
5636 mchunkptr prev = chunk_minus_offset(p, prevsize);
5637 psize += prevsize;
5638 p = prev;
5639 if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */
5640 if (p != fm->dv) {
5641 unlink_chunk(fm, p, prevsize);
5642 }
5643 else if ((next->head & INUSE_BITS) == INUSE_BITS) {
5644 fm->dvsize = psize;
5645 set_free_with_pinuse(p, psize, next);
5646 goto postaction;
5647 }
5648 }
5649 else
5650 goto erroraction;
5651 }
5652 }
5653
5654 if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) {
5655 if (!cinuse(next)) { /* consolidate forward */
5656 if (next == fm->top) {
5657 size_t tsize = fm->topsize += psize;
5658 fm->top = p;
5659 p->head = tsize | PINUSE_BIT;
5660 if (p == fm->dv) {
5661 fm->dv = 0;
5662 fm->dvsize = 0;
5663 }
5664 if (should_trim(fm, tsize))
5665 sys_trim(fm, 0);
5666 goto postaction;

Callers 2

ifFunction · 0.85
mspace_reallocFunction · 0.85

Calls 2

sys_trimFunction · 0.85
release_unused_segmentsFunction · 0.85

Tested by

no test coverage detected