Try to realloc; only in-place unless can_move true */
| 4903 | |
| 4904 | /* Try to realloc; only in-place unless can_move true */ |
| 4905 | static 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; |
no test coverage detected