blob: fc492f03b4bd130b3d6dcddd0eadd272210239bb (
plain) (
tree)
|
|
#include "malloc.h"
#include <assert.h>
#include <string.h>
void*
__reallocarray_impl(heap_cache_t *cache, void *ptr, size_t nmemb, size_t w)
{
/* Free if w == nmemb == 0*/
if(w == 0 || nmemb == 0) {
__free_impl(cache, ptr);
return NULL;
}
if(ptr == NULL)
return __calloc_impl(cache, nmemb, w);
size_t allocw = w * nmemb;
w = REALW(w);
bucket_obj_t *obj = OBJ_FROM_PTR(ptr);
assert(OBJ_VALID(obj));
size_t oldw = OBJ_WIDTH(obj);
if(allocw < oldw) return ptr;
ptr = __realloc_impl(cache, ptr, allocw);
size_t wdiff = allocw - oldw;
void *zeroat = (void*)(((uintptr_t)ptr) + oldw);
memset(zeroat, 0, wdiff);
return ptr;
}
|