shared/specifier: use realloc to free some memory after specifier expansion
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 28 Mar 2018 08:33:40 +0000 (10:33 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 28 Mar 2018 08:38:45 +0000 (10:38 +0200)
This is a separate commit only because it actually *increases* memory allocations:
==3256==   total heap usage: 100,120 allocs, 100,120 frees, 13,097,140 bytes allocated
to
==4690==   total heap usage: 100,121 allocs, 100,121 frees, 14,198,329 bytes allocated

Essentially, we do a little more work to reduce the memory footprint a bit. For a
test where we just allocate the memory and drop it soon afterwards, this is not
beneficial, but it should still be useful for a long running program.

src/shared/specifier.c

index c4a3ffd..a602413 100644 (file)
@@ -102,11 +102,18 @@ int specifier_printf(const char *text, const Specifier table[], void *userdata,
                 else
                         *(t++) = *f;
 
-        /* if string ended with a stray %, also end with % */
+        /* If string ended with a stray %, also end with % */
         if (percent)
                 *(t++) = '%';
+        *(t++) = 0;
+
+        /* Try to deallocate unused bytes, but don't sweat it too much */
+        if ((size_t)(t - ret) < allocated) {
+                t = realloc(ret, t - ret);
+                if (t)
+                        ret = t;
+        }
 
-        *t = 0;
         *_ret = TAKE_PTR(ret);
         return 0;
 }