| 4953 | } |
| 4954 | |
| 4955 | void mspace_free(mspace msp, void* mem) { |
| 4956 | if (mem != 0) { |
| 4957 | size_t psize = 0; |
| 4958 | mchunkptr p = mem2chunk(mem); |
| 4959 | #if FOOTERS |
| 4960 | mstate fm = get_mstate_for(p); |
| 4961 | #else /* FOOTERS */ |
| 4962 | mstate fm = (mstate)msp; |
| 4963 | #endif /* FOOTERS */ |
| 4964 | if (!ok_magic(fm)) { |
| 4965 | USAGE_ERROR_ACTION(fm, p); |
| 4966 | return; |
| 4967 | } |
| 4968 | if (!PREACTION(fm)) { |
| 4969 | check_inuse_chunk(fm, p); |
| 4970 | if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) { |
| 4971 | psize = chunksize(p); |
| 4972 | mchunkptr next = chunk_plus_offset(p, psize); |
| 4973 | if (!pinuse(p)) { |
| 4974 | size_t prevsize = p->prev_foot; |
| 4975 | if ((prevsize & IS_MMAPPED_BIT) != 0) { |
| 4976 | prevsize &= ~IS_MMAPPED_BIT; |
| 4977 | psize += prevsize + MMAP_FOOT_PAD; |
| 4978 | if (CALL_MUNMAP((char*)p - prevsize, psize) == 0) |
| 4979 | fm->footprint -= psize; |
| 4980 | goto postaction; |
| 4981 | } |
| 4982 | else { |
| 4983 | mchunkptr prev = chunk_minus_offset(p, prevsize); |
| 4984 | psize += prevsize; |
| 4985 | p = prev; |
| 4986 | if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */ |
| 4987 | if (p != fm->dv) { |
| 4988 | unlink_chunk(fm, p, prevsize); |
| 4989 | } |
| 4990 | else if ((next->head & INUSE_BITS) == INUSE_BITS) { |
| 4991 | fm->dvsize = psize; |
| 4992 | set_free_with_pinuse(p, psize, next); |
| 4993 | goto postaction; |
| 4994 | } |
| 4995 | } |
| 4996 | else |
| 4997 | goto erroraction; |
| 4998 | } |
| 4999 | } |
| 5000 | |
| 5001 | if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) { |
| 5002 | if (!cinuse(next)) { /* consolidate forward */ |
| 5003 | if (next == fm->top) { |
| 5004 | size_t tsize = fm->topsize += psize; |
| 5005 | fm->top = p; |
| 5006 | p->head = tsize | PINUSE_BIT; |
| 5007 | if (p == fm->dv) { |
| 5008 | fm->dv = 0; |
| 5009 | fm->dvsize = 0; |
| 5010 | } |
| 5011 | if (should_trim(fm, tsize)) |
| 5012 | sys_trim(fm, 0, 0); |
no test coverage detected