| 3776 | } |
| 3777 | |
| 3778 | SPP_API inline void* mspace_realloc(mspace msp, void* oldmem, size_t bytes) |
| 3779 | { |
| 3780 | void* mem = 0; |
| 3781 | if (oldmem == 0) |
| 3782 | mem = mspace_malloc(msp, bytes); |
| 3783 | else if (bytes >= MAX_REQUEST) |
| 3784 | SPP_MALLOC_FAILURE_ACTION; |
| 3785 | #ifdef REALLOC_ZERO_BYTES_FREES |
| 3786 | else if (bytes == 0) |
| 3787 | mspace_free(msp, oldmem); |
| 3788 | #endif |
| 3789 | else |
| 3790 | { |
| 3791 | size_t nb = request2size(bytes); |
| 3792 | mchunkptr oldp = mem2chunk(oldmem); |
| 3793 | #if ! SPP_FOOTERS |
| 3794 | mstate m = (mstate)msp; |
| 3795 | #else |
| 3796 | mstate m = get_mstate_for(oldp); |
| 3797 | if (!m->ok_magic()) |
| 3798 | { |
| 3799 | SPP_USAGE_ERROR_ACTION(m, oldmem); |
| 3800 | return 0; |
| 3801 | } |
| 3802 | #endif |
| 3803 | if (1) |
| 3804 | { |
| 3805 | mchunkptr newp = m->try_realloc_chunk(oldp, nb, 1); |
| 3806 | if (newp != 0) |
| 3807 | { |
| 3808 | m->check_inuse_chunk(newp); |
| 3809 | mem = chunk2mem(newp); |
| 3810 | } |
| 3811 | else |
| 3812 | { |
| 3813 | mem = mspace_malloc(m, bytes); |
| 3814 | if (mem != 0) |
| 3815 | { |
| 3816 | size_t oc = oldp->chunksize() - oldp->overhead_for(); |
| 3817 | memcpy(mem, oldmem, (oc < bytes) ? oc : bytes); |
| 3818 | mspace_free(m, oldmem); |
| 3819 | } |
| 3820 | } |
| 3821 | } |
| 3822 | } |
| 3823 | return mem; |
| 3824 | } |
| 3825 |
no test coverage detected