summaryrefslogtreecommitdiff
path: root/src/zmalloc.c
diff options
context:
space:
mode:
authorBruce Merry <bmerry@gmail.com>2018-09-30 11:49:03 +0200
committerBruce Merry <bmerry@gmail.com>2018-09-30 11:49:03 +0200
commit8fd1031b10dec256d5b365b278815f9d8444e601 (patch)
treeac8ec935162efe46728f6acf3df5166614453493 /src/zmalloc.c
parent1d6711a7645cd11bea2e55a438e7a25891117cd6 (diff)
downloadredis-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.c20
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