Try to realloc; only in-place unless can_move true */
| 4804 | |
| 4805 | /* Try to realloc; only in-place unless can_move true */ |
| 4806 | static mchunkptr try_realloc_chunk(mstate m, mchunkptr p, size_t nb, |
| 4807 | int can_move) { |
| 4808 | mchunkptr newp = 0; |
| 4809 | size_t oldsize = chunksize(p); |
| 4810 | mchunkptr next = chunk_plus_offset(p, oldsize); |
| 4811 | if (RTCHECK(ok_address(m, p) && ok_inuse(p) && |
| 4812 | ok_next(p, next) && ok_pinuse(next))) { |
| 4813 | if (is_mmapped(p)) { |
| 4814 | newp = mmap_resize(m, p, nb, can_move); |
| 4815 | } |
| 4816 | else if (oldsize >= nb) { /* already big enough */ |
| 4817 | size_t rsize = oldsize - nb; |
| 4818 | if (rsize >= MIN_CHUNK_SIZE) { /* split off remainder */ |
| 4819 | mchunkptr r = chunk_plus_offset(p, nb); |
| 4820 | set_inuse(m, p, nb); |
| 4821 | set_inuse(m, r, rsize); |
| 4822 | dispose_chunk(m, r, rsize); |
| 4823 | } |
| 4824 | newp = p; |
| 4825 | } |
| 4826 | else if (next == m->top) { /* extend into top */ |
| 4827 | if (oldsize + m->topsize > nb) { |
| 4828 | size_t newsize = oldsize + m->topsize; |
| 4829 | size_t newtopsize = newsize - nb; |
| 4830 | mchunkptr newtop = chunk_plus_offset(p, nb); |
| 4831 | set_inuse(m, p, nb); |
| 4832 | newtop->head = newtopsize |PINUSE_BIT; |
| 4833 | m->top = newtop; |
| 4834 | m->topsize = newtopsize; |
| 4835 | newp = p; |
| 4836 | } |
| 4837 | } |
| 4838 | else if (next == m->dv) { /* extend into dv */ |
| 4839 | size_t dvs = m->dvsize; |
| 4840 | if (oldsize + dvs >= nb) { |
| 4841 | size_t dsize = oldsize + dvs - nb; |
| 4842 | if (dsize >= MIN_CHUNK_SIZE) { |
| 4843 | mchunkptr r = chunk_plus_offset(p, nb); |
| 4844 | mchunkptr n = chunk_plus_offset(r, dsize); |
| 4845 | set_inuse(m, p, nb); |
| 4846 | set_size_and_pinuse_of_free_chunk(r, dsize); |
| 4847 | clear_pinuse(n); |
| 4848 | m->dvsize = dsize; |
| 4849 | m->dv = r; |
| 4850 | } |
| 4851 | else { /* exhaust dv */ |
| 4852 | size_t newsize = oldsize + dvs; |
| 4853 | set_inuse(m, p, newsize); |
| 4854 | m->dvsize = 0; |
| 4855 | m->dv = 0; |
| 4856 | } |
| 4857 | newp = p; |
| 4858 | } |
| 4859 | } |
| 4860 | else if (!cinuse(next)) { /* extend into next free chunk */ |
| 4861 | size_t nextsize = chunksize(next); |
| 4862 | if (oldsize + nextsize >= nb) { |
| 4863 | size_t rsize = oldsize + nextsize - nb; |
no test coverage detected