MCPcopy Create free account
hub / github.com/1a1a11a/libCacheSim / try_realloc_chunk

Method try_realloc_chunk

libCacheSim/dataStructure/sparsepp/spp_dlalloc.h:3232–3326  ·  view source on GitHub ↗

Try to realloc; only in-place unless can_move true

Source from the content-addressed store, hash-verified

3230
3231// Try to realloc; only in-place unless can_move true
3232mchunkptr 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 {

Callers 2

mspace_reallocFunction · 0.80
mspace_realloc_in_placeFunction · 0.80

Calls 7

chunk2memFunction · 0.85
chunksizeMethod · 0.80
chunk_plus_offsetMethod · 0.80
is_mmappedMethod · 0.80
clear_pinuseMethod · 0.80
cinuseMethod · 0.80

Tested by

no test coverage detected