From ec93bba353113cb81dc97a738dc94de03f16b143 Mon Sep 17 00:00:00 2001 From: antirez Date: Thu, 4 Jun 2009 18:50:54 +0200 Subject: [PATCH] macosx specific zmalloc.c, uses malloc_size function in order to avoid to waste memory and time to put an additional header --- TODO | 3 ++- zmalloc.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/TODO b/TODO index 9addd6e62..4fff80a85 100644 --- a/TODO +++ b/TODO @@ -29,7 +29,8 @@ AFTER 1.0 stable release side the type also takes an hash table with key->score mapping, so that when there is an update we lookup the current score and can traverse the tree. * BITMAP type - * LRANGE 4 0 should return the same elements as LRANGE 0 4 but in reverse order + * LRANGE 4 0 should return the same elements as LRANGE 0 4 but in reverse order (only if we get enough motivated requests about it) + * zmalloc() should avoid to add a private header for archs where there is some other kind of libc-specific way to get the size of a malloced block. FUTURE HINTS diff --git a/zmalloc.c b/zmalloc.c index c76b2746e..4cb2c53c6 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) {