| 5607 | } |
| 5608 | |
| 5609 | void 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; |
no test coverage detected