X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/ed9b544e10b84cd43348ddfab7068b610a5df1f7..5b2a1c292ac20d84ae2202bc21759a2f06b8041f:/zmalloc.c diff --git a/zmalloc.c b/zmalloc.c index b5cb7d6a..eb06da3b 100644 --- a/zmalloc.c +++ b/zmalloc.c @@ -28,45 +28,85 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include +#include "config.h" + +#if defined(__sun) +#define PREFIX_SIZE sizeof(long long) +#else +#define PREFIX_SIZE sizeof(size_t) +#endif static size_t used_memory = 0; +static void zmalloc_oom(size_t size) { + fprintf(stderr, "zmalloc: Out of memory trying to allocate %zu bytes\n", + size); + fflush(stderr); + abort(); +} + void *zmalloc(size_t size) { - void *ptr = malloc(size+sizeof(size_t)); + void *ptr = malloc(size+PREFIX_SIZE); + if (!ptr) zmalloc_oom(size); +#ifdef HAVE_MALLOC_SIZE + used_memory += redis_malloc_size(ptr); + return ptr; +#else *((size_t*)ptr) = size; - used_memory += size+sizeof(size_t); - return ptr+sizeof(size_t); + used_memory += size+PREFIX_SIZE; + return (char*)ptr+PREFIX_SIZE; +#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); - realptr = ptr-sizeof(size_t); +#ifdef HAVE_MALLOC_SIZE + oldsize = redis_malloc_size(ptr); + newptr = realloc(ptr,size); + if (!newptr) zmalloc_oom(size); + + used_memory -= oldsize; + used_memory += redis_malloc_size(newptr); + return newptr; +#else + realptr = (char*)ptr-PREFIX_SIZE; oldsize = *((size_t*)realptr); - newptr = realloc(realptr,size+sizeof(size_t)); - if (!newptr) return NULL; + newptr = realloc(realptr,size+PREFIX_SIZE); + if (!newptr) zmalloc_oom(size); *((size_t*)newptr) = size; used_memory -= oldsize; used_memory += size; - return newptr+sizeof(size_t); + return (char*)newptr+PREFIX_SIZE; +#endif } void zfree(void *ptr) { +#ifndef HAVE_MALLOC_SIZE void *realptr; size_t oldsize; +#endif if (ptr == NULL) return; - realptr = ptr-sizeof(size_t); +#ifdef HAVE_MALLOC_SIZE + used_memory -= redis_malloc_size(ptr); + free(ptr); +#else + realptr = (char*)ptr-PREFIX_SIZE; oldsize = *((size_t*)realptr); - used_memory -= oldsize+sizeof(size_t); + used_memory -= oldsize+PREFIX_SIZE; free(realptr); +#endif } char *zstrdup(const char *s) {