MCPcopy Index your code
hub / github.com/dcodeIO/webassembly / try_realloc_chunk

Function try_realloc_chunk

lib/dlmalloc/malloc.c:4806–4883  ·  view source on GitHub ↗

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

Source from the content-addressed store, hash-verified

4804
4805/* Try to realloc; only in-place unless can_move true */
4806static 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;

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