X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/ec93bba353113cb81dc97a738dc94de03f16b143..e7546c639301968a011265b96ea6e7f22407960e:/zmalloc.c diff --git a/zmalloc.c b/zmalloc.c index 4cb2c53c..eb06da3b 100644 --- a/zmalloc.c +++ b/zmalloc.c @@ -28,28 +28,37 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include +#include "config.h" -#ifdef __APPLE__ -#include -#define HAVE_MALLOC_SIZE -#define redis_malloc_size(p) malloc_size(p) +#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) return NULL; + 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 (char*)ptr+sizeof(size_t); + used_memory += size+PREFIX_SIZE; + return (char*)ptr+PREFIX_SIZE; #endif } @@ -64,21 +73,21 @@ void *zrealloc(void *ptr, size_t size) { #ifdef HAVE_MALLOC_SIZE oldsize = redis_malloc_size(ptr); newptr = realloc(ptr,size); - if (!newptr) return NULL; + if (!newptr) zmalloc_oom(size); used_memory -= oldsize; used_memory += redis_malloc_size(newptr); return newptr; #else - realptr = (char*)ptr-sizeof(size_t); + 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 (char*)newptr+sizeof(size_t); + return (char*)newptr+PREFIX_SIZE; #endif } @@ -93,9 +102,9 @@ void zfree(void *ptr) { used_memory -= redis_malloc_size(ptr); free(ptr); #else - realptr = (char*)ptr-sizeof(size_t); + realptr = (char*)ptr-PREFIX_SIZE; oldsize = *((size_t*)realptr); - used_memory -= oldsize+sizeof(size_t); + used_memory -= oldsize+PREFIX_SIZE; free(realptr); #endif }