| 5714 | } |
| 5715 | |
| 5716 | void 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; |
no test coverage detected