static void * stat_realloc(ErtsAlcType_t n, void *extra, void *ptr, Uint size) { ErtsAllocatorFunctions_t *real_af = (ErtsAllocatorFunctions_t *) extra; Uint old_size; Uint ssize; void *sptr; void *res; erts_mtx_lock(&instr_mutex); if (ptr) { sptr = (void *) (((char *) ptr) - STAT_BLOCK_HEADER_SIZE); old_size = ((StatBlock_t *) sptr)->size; } else { sptr = NULL; old_size = 0; } ssize = size + STAT_BLOCK_HEADER_SIZE; res = (*real_af->realloc)(n, real_af->extra, sptr, ssize); if (res) { stat_upd_realloc(n, size, old_size); ((StatBlock_t *) res)->size = size; res = (void *) ((StatBlock_t *) res)->mem; } erts_mtx_unlock(&instr_mutex); return res; }
static void * stat_realloc(ErtsAlcType_t n, void *extra, void *ptr, Uint size) { ErtsAllocatorFunctions_t *real_af = (ErtsAllocatorFunctions_t *) extra; Uint old_size; Uint ssize; void *sptr; void *res; if (!erts_is_allctr_wrapper_prelocked()) { erts_mtx_lock(&instr_mutex); } if (ptr) { sptr = (void *) (((char *) ptr) - STAT_BLOCK_HEADER_SIZE); old_size = ((StatBlock_t *) sptr)->size; } else { sptr = NULL; old_size = 0; } ssize = size + STAT_BLOCK_HEADER_SIZE; res = (*real_af->realloc)(n, real_af->extra, sptr, ssize); if (res) { stat_upd_realloc(n, size, old_size); ((StatBlock_t *) res)->size = size; #ifdef VALGRIND ((StatBlock_t *) res)->valgrind_leak_suppressor = res; #endif res = (void *) ((StatBlock_t *) res)->mem; } if (!erts_is_allctr_wrapper_prelocked()) { erts_mtx_unlock(&instr_mutex); } return res; }
static void * map_stat_realloc(ErtsAlcType_t n, void *extra, void *ptr, Uint size) { ErtsAllocatorFunctions_t *real_af = (ErtsAllocatorFunctions_t *) extra; Uint old_size; Uint msize; void *mptr; void *res; if (!erts_is_allctr_wrapper_prelocked()) { erts_mtx_lock(&instr_x_mutex); erts_mtx_lock(&instr_mutex); } if (ptr) { mptr = (void *) (((char *) ptr) - MAP_STAT_BLOCK_HEADER_SIZE); old_size = ((MapStatBlock_t *) mptr)->size; } else { mptr = NULL; old_size = 0; } msize = size + MAP_STAT_BLOCK_HEADER_SIZE; res = (*real_af->realloc)(n, real_af->extra, mptr, msize); if (res) { MapStatBlock_t *mb = (MapStatBlock_t *) res; mb->size = size; mb->type_no = n; mb->pid = erts_get_current_pid(); stat_upd_realloc(n, size, old_size); if (mptr != res) { if (mptr) { if (mb->prev) mb->prev->next = mb; else { ASSERT(mem_anchor == (MapStatBlock_t *) mptr); mem_anchor = mb; } if (mb->next) mb->next->prev = mb; } else { mb->prev = NULL; mb->next = mem_anchor; if (mem_anchor) mem_anchor->prev = mb; mem_anchor = mb; } } res = (void *) mb->mem; } if (!erts_is_allctr_wrapper_prelocked()) { erts_mtx_unlock(&instr_mutex); erts_mtx_unlock(&instr_x_mutex); } return res; }