mirror of
https://codeberg.org/redict/redict.git
synced 2025-01-22 16:18:28 -05:00
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:
parent
333298dac3
commit
ec93bba353
3
TODO
3
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
|
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
|
||||||
|
|
||||||
|
30
zmalloc.c
30
zmalloc.c
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user