diff options
author | Bruce Merry <bmerry@gmail.com> | 2018-09-30 11:49:03 +0200 |
---|---|---|
committer | Bruce Merry <bmerry@gmail.com> | 2018-09-30 11:49:03 +0200 |
commit | 8fd1031b10dec256d5b365b278815f9d8444e601 (patch) | |
tree | ac8ec935162efe46728f6acf3df5166614453493 /src/zmalloc.c | |
parent | 1d6711a7645cd11bea2e55a438e7a25891117cd6 (diff) | |
download | redis-8fd1031b10dec256d5b365b278815f9d8444e601.tar.gz |
Fix incorrect memory usage accounting in zrealloc
When HAVE_MALLOC_SIZE is false, each call to zrealloc causes used_memory
to increase by PREFIX_SIZE more than it should, due to mis-matched
accounting between the original zmalloc (which includes PREFIX size in
its increment) and zrealloc (which misses it from its decrement).
I've also supplied a command-line test to easily demonstrate the
problem. It's not wired into the test framework, because I don't know
TCL so I'm not sure how to automate it.
Diffstat (limited to 'src/zmalloc.c')
-rw-r--r-- | src/zmalloc.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/src/zmalloc.c b/src/zmalloc.c index 308774d86..2482f512b 100644 --- a/src/zmalloc.c +++ b/src/zmalloc.c @@ -164,7 +164,7 @@ void *zrealloc(void *ptr, size_t size) { if (!newptr) zmalloc_oom_handler(size); *((size_t*)newptr) = size; - update_zmalloc_stat_free(oldsize); + update_zmalloc_stat_free(oldsize+PREFIX_SIZE); update_zmalloc_stat_alloc(size+PREFIX_SIZE); return (char*)newptr+PREFIX_SIZE; #endif @@ -438,4 +438,20 @@ size_t zmalloc_get_memory_size(void) { #endif } - +#ifdef REDIS_TEST +#define UNUSED(x) ((void)(x)) +int zmalloc_test(int argc, char **argv) { + void *ptr; + + UNUSED(argc); + UNUSED(argv); + printf("Initial used memory: %zu\n", zmalloc_used_memory()); + ptr = zmalloc(123); + printf("Allocated 123 bytes; used: %zu\n", zmalloc_used_memory()); + ptr = zrealloc(ptr, 456); + printf("Reallocated to 456 bytes; used: %zu\n", zmalloc_used_memory()); + zfree(ptr); + printf("Freed pointer; used: %zu\n", zmalloc_used_memory()); + return 0; +} +#endif |