MCPcopy Create free account
hub / github.com/emscripten-core/emscripten / try_realloc_chunk

Function try_realloc_chunk

system/lib/dlmalloc.c:4905–4982  ·  view source on GitHub ↗

Try to realloc; only in-place unless can_move true */

Source from the content-addressed store, hash-verified

4903
4904/* Try to realloc; only in-place unless can_move true */
4905static mchunkptr try_realloc_chunk(mstate m, mchunkptr p, size_t nb,
4906 int can_move) {
4907 mchunkptr newp = 0;
4908 size_t oldsize = chunksize(p);
4909 mchunkptr next = chunk_plus_offset(p, oldsize);
4910 if (RTCHECK(ok_address(m, p) && ok_inuse(p) &&
4911 ok_next(p, next) && ok_pinuse(next))) {
4912 if (is_mmapped(p)) {
4913 newp = mmap_resize(m, p, nb, can_move);
4914 }
4915 else if (oldsize >= nb) { /* already big enough */
4916 size_t rsize = oldsize - nb;
4917 if (rsize >= MIN_CHUNK_SIZE) { /* split off remainder */
4918 mchunkptr r = chunk_plus_offset(p, nb);
4919 set_inuse(m, p, nb);
4920 set_inuse(m, r, rsize);
4921 dispose_chunk(m, r, rsize);
4922 }
4923 newp = p;
4924 }
4925 else if (next == m->top) { /* extend into top */
4926 if (oldsize + m->topsize > nb) {
4927 size_t newsize = oldsize + m->topsize;
4928 size_t newtopsize = newsize - nb;
4929 mchunkptr newtop = chunk_plus_offset(p, nb);
4930 set_inuse(m, p, nb);
4931 newtop->head = newtopsize |PINUSE_BIT;
4932 m->top = newtop;
4933 m->topsize = newtopsize;
4934 newp = p;
4935 }
4936 }
4937 else if (next == m->dv) { /* extend into dv */
4938 size_t dvs = m->dvsize;
4939 if (oldsize + dvs >= nb) {
4940 size_t dsize = oldsize + dvs - nb;
4941 if (dsize >= MIN_CHUNK_SIZE) {
4942 mchunkptr r = chunk_plus_offset(p, nb);
4943 mchunkptr n = chunk_plus_offset(r, dsize);
4944 set_inuse(m, p, nb);
4945 set_size_and_pinuse_of_free_chunk(r, dsize);
4946 clear_pinuse(n);
4947 m->dvsize = dsize;
4948 m->dv = r;
4949 }
4950 else { /* exhaust dv */
4951 size_t newsize = oldsize + dvs;
4952 set_inuse(m, p, newsize);
4953 m->dvsize = 0;
4954 m->dv = 0;
4955 }
4956 newp = p;
4957 }
4958 }
4959 else if (!cinuse(next)) { /* extend into next free chunk */
4960 size_t nextsize = chunksize(next);
4961 if (oldsize + nextsize >= nb) {
4962 size_t rsize = oldsize + nextsize - nb;

Callers 4

dlreallocFunction · 0.85
dlrealloc_in_placeFunction · 0.85
mspace_reallocFunction · 0.85
mspace_realloc_in_placeFunction · 0.85

Calls 2

mmap_resizeFunction · 0.85
dispose_chunkFunction · 0.85

Tested by

no test coverage detected