X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/333298dac3e4b9c147851772be854b5dabcab8c2..ec93bba353113cb81dc97a738dc94de03f16b143:/zmalloc.c diff --git a/zmalloc.c b/zmalloc.c index c76b2746..4cb2c53c 100644 --- a/zmalloc.c +++ b/zmalloc.c @@ -31,23 +31,45 @@ #include #include +#ifdef __APPLE__ +#include +#define HAVE_MALLOC_SIZE +#define redis_malloc_size(p) malloc_size(p) +#endif + static size_t used_memory = 0; void *zmalloc(size_t size) { void *ptr = malloc(size+sizeof(size_t)); if (!ptr) return NULL; +#ifdef HAVE_MALLOC_SIZE + used_memory += redis_malloc_size(ptr); + return ptr; +#else *((size_t*)ptr) = size; used_memory += size+sizeof(size_t); return (char*)ptr+sizeof(size_t); +#endif } void *zrealloc(void *ptr, size_t size) { +#ifndef HAVE_MALLOC_SIZE void *realptr; +#endif size_t oldsize; void *newptr; if (ptr == NULL) return zmalloc(size); +#ifdef HAVE_MALLOC_SIZE + oldsize = redis_malloc_size(ptr); + newptr = realloc(ptr,size); + if (!newptr) return NULL; + + used_memory -= oldsize; + used_memory += redis_malloc_size(newptr); + return newptr; +#else realptr = (char*)ptr-sizeof(size_t); oldsize = *((size_t*)realptr); newptr = realloc(realptr,size+sizeof(size_t)); @@ -57,17 +79,25 @@ void *zrealloc(void *ptr, size_t size) { used_memory -= oldsize; used_memory += size; return (char*)newptr+sizeof(size_t); +#endif } void zfree(void *ptr) { +#ifndef HAVE_MALLOC_SIZE void *realptr; size_t oldsize; +#endif if (ptr == NULL) return; +#ifdef HAVE_MALLOC_SIZE + used_memory -= redis_malloc_size(ptr); + free(ptr); +#else realptr = (char*)ptr-sizeof(size_t); oldsize = *((size_t*)realptr); used_memory -= oldsize+sizeof(size_t); free(realptr); +#endif } char *zstrdup(const char *s) {