Try to realloc; only in-place unless can_move true
| 3230 | |
| 3231 | // Try to realloc; only in-place unless can_move true |
| 3232 | mchunkptr malloc_state::try_realloc_chunk(mchunkptr p, size_t nb, int can_move) |
| 3233 | { |
| 3234 | mchunkptr newp = 0; |
| 3235 | size_t oldsize = p->chunksize(); |
| 3236 | mchunkptr next = (mchunkptr)p->chunk_plus_offset(oldsize); |
| 3237 | if (rtcheck(ok_address(p) && ok_inuse(p) && |
| 3238 | ok_next(p, next) && ok_pinuse(next))) |
| 3239 | { |
| 3240 | if (p->is_mmapped()) |
| 3241 | newp = mmap_resize(p, nb, can_move); |
| 3242 | else if (oldsize >= nb) |
| 3243 | { |
| 3244 | // already big enough |
| 3245 | size_t rsize = oldsize - nb; |
| 3246 | if (rsize >= MIN_CHUNK_SIZE) |
| 3247 | { |
| 3248 | // split off remainder |
| 3249 | mchunkptr r = (mchunkptr)p->chunk_plus_offset(nb); |
| 3250 | set_inuse(p, nb); |
| 3251 | set_inuse(r, rsize); |
| 3252 | dispose_chunk(r, rsize); |
| 3253 | } |
| 3254 | newp = p; |
| 3255 | } |
| 3256 | else if (next == _top) |
| 3257 | { |
| 3258 | // extend into top |
| 3259 | if (oldsize + _topsize > nb) |
| 3260 | { |
| 3261 | size_t newsize = oldsize + _topsize; |
| 3262 | size_t newtopsize = newsize - nb; |
| 3263 | mchunkptr newtop = (mchunkptr)p->chunk_plus_offset(nb); |
| 3264 | set_inuse(p, nb); |
| 3265 | newtop->_head = newtopsize | PINUSE_BIT; |
| 3266 | _top = newtop; |
| 3267 | _topsize = newtopsize; |
| 3268 | newp = p; |
| 3269 | } |
| 3270 | } |
| 3271 | else if (next == _dv) |
| 3272 | { |
| 3273 | // extend into dv |
| 3274 | size_t dvs = _dvsize; |
| 3275 | if (oldsize + dvs >= nb) |
| 3276 | { |
| 3277 | size_t dsize = oldsize + dvs - nb; |
| 3278 | if (dsize >= MIN_CHUNK_SIZE) |
| 3279 | { |
| 3280 | mchunkptr r = (mchunkptr)p->chunk_plus_offset(nb); |
| 3281 | mchunkptr n = (mchunkptr)r->chunk_plus_offset(dsize); |
| 3282 | set_inuse(p, nb); |
| 3283 | r->set_size_and_pinuse_of_free_chunk(dsize); |
| 3284 | n->clear_pinuse(); |
| 3285 | _dvsize = dsize; |
| 3286 | _dv = r; |
| 3287 | } |
| 3288 | else |
| 3289 | { |
no test coverage detected