MCPcopy Create free account
hub / github.com/emscripten-core/emscripten / mspace_free

Function mspace_free

system/lib/dlmalloc.c:5716–5815  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

5714}
5715
5716void mspace_free(mspace msp, void* mem) {
5717 if (mem != 0) {
5718 mchunkptr p = mem2chunk(mem);
5719#if FOOTERS
5720 mstate fm = get_mstate_for(p);
5721 (void)msp; /* placate people compiling -Wunused */
5722#else /* FOOTERS */
5723 mstate fm = (mstate)msp;
5724#endif /* FOOTERS */
5725 if (!ok_magic(fm)) {
5726 USAGE_ERROR_ACTION(fm, p);
5727 return;
5728 }
5729 if (!PREACTION(fm)) {
5730 check_inuse_chunk(fm, p);
5731 if (RTCHECK(ok_address(fm, p) && ok_inuse(p))) {
5732 size_t psize = chunksize(p);
5733 mchunkptr next = chunk_plus_offset(p, psize);
5734 if (!pinuse(p)) {
5735 size_t prevsize = p->prev_foot;
5736 if (is_mmapped(p)) {
5737 psize += prevsize + MMAP_FOOT_PAD;
5738 if (CALL_MUNMAP((char*)p - prevsize, psize) == 0)
5739 fm->footprint -= psize;
5740 goto postaction;
5741 }
5742 else {
5743 mchunkptr prev = chunk_minus_offset(p, prevsize);
5744 psize += prevsize;
5745 p = prev;
5746 if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */
5747 if (p != fm->dv) {
5748 unlink_chunk(fm, p, prevsize);
5749 }
5750 else if ((next->head & INUSE_BITS) == INUSE_BITS) {
5751 fm->dvsize = psize;
5752 set_free_with_pinuse(p, psize, next);
5753 goto postaction;
5754 }
5755 }
5756 else
5757 goto erroraction;
5758 }
5759 }
5760
5761 if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) {
5762 if (!cinuse(next)) { /* consolidate forward */
5763 if (next == fm->top) {
5764 size_t tsize = fm->topsize += psize;
5765 fm->top = p;
5766 p->head = tsize | PINUSE_BIT;
5767 if (p == fm->dv) {
5768 fm->dv = 0;
5769 fm->dvsize = 0;
5770 }
5771 if (should_trim(fm, tsize))
5772 sys_trim(fm, 0);
5773 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