macosx specific zmalloc.c, uses malloc_size function in order to avoid to waste memory and time to put an additional header

This commit is contained in:
antirez 2009-06-04 18:50:54 +02:00
parent 333298dac3
commit ec93bba353
2 changed files with 32 additions and 1 deletions

3
TODO
View File

@ -29,7 +29,8 @@ AFTER 1.0 stable release
side the type also takes an hash table with key->score mapping, so that when 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. there is an update we lookup the current score and can traverse the tree.
* BITMAP type * 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 FUTURE HINTS

View File

@ -31,23 +31,45 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#ifdef __APPLE__
#include <malloc/malloc.h>
#define HAVE_MALLOC_SIZE
#define redis_malloc_size(p) malloc_size(p)
#endif
static size_t used_memory = 0; static size_t used_memory = 0;
void *zmalloc(size_t size) { void *zmalloc(size_t size) {
void *ptr = malloc(size+sizeof(size_t)); void *ptr = malloc(size+sizeof(size_t));
if (!ptr) return NULL; if (!ptr) return NULL;
#ifdef HAVE_MALLOC_SIZE
used_memory += redis_malloc_size(ptr);
return ptr;
#else
*((size_t*)ptr) = size; *((size_t*)ptr) = size;
used_memory += size+sizeof(size_t); used_memory += size+sizeof(size_t);
return (char*)ptr+sizeof(size_t); return (char*)ptr+sizeof(size_t);
#endif
} }
void *zrealloc(void *ptr, size_t size) { void *zrealloc(void *ptr, size_t size) {
#ifndef HAVE_MALLOC_SIZE
void *realptr; void *realptr;
#endif
size_t oldsize; size_t oldsize;
void *newptr; void *newptr;
if (ptr == NULL) return zmalloc(size); 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); realptr = (char*)ptr-sizeof(size_t);
oldsize = *((size_t*)realptr); oldsize = *((size_t*)realptr);
newptr = realloc(realptr,size+sizeof(size_t)); newptr = realloc(realptr,size+sizeof(size_t));
@ -57,17 +79,25 @@ void *zrealloc(void *ptr, size_t size) {
used_memory -= oldsize; used_memory -= oldsize;
used_memory += size; used_memory += size;
return (char*)newptr+sizeof(size_t); return (char*)newptr+sizeof(size_t);
#endif
} }
void zfree(void *ptr) { void zfree(void *ptr) {
#ifndef HAVE_MALLOC_SIZE
void *realptr; void *realptr;
size_t oldsize; size_t oldsize;
#endif
if (ptr == NULL) return; if (ptr == NULL) return;
#ifdef HAVE_MALLOC_SIZE
used_memory -= redis_malloc_size(ptr);
free(ptr);
#else
realptr = (char*)ptr-sizeof(size_t); realptr = (char*)ptr-sizeof(size_t);
oldsize = *((size_t*)realptr); oldsize = *((size_t*)realptr);
used_memory -= oldsize+sizeof(size_t); used_memory -= oldsize+sizeof(size_t);
free(realptr); free(realptr);
#endif
} }
char *zstrdup(const char *s) { char *zstrdup(const char *s) {