Code

utils strbuf: Added 'min_size' to be considered when shrinking the buffer.
[sysdb.git] / src / utils / strbuf.c
index c310b443448a14be1eb96f8c7fdc4618707868c5..ecc05315ef897f9d84a415ccecb9b6f77e89e9bd 100644 (file)
@@ -39,7 +39,8 @@
 /* free memory if most of the buffer is unused */
 #define CHECK_SHRINK(buf) \
        do { \
-               if ((buf)->pos < (buf)->size / 3) \
+               if (((buf)->pos < (buf)->size / 3) \
+                               && (2 * (buf)->pos > (buf)->min_size)) \
                        /* don't free all memory to avoid churn */ \
                        strbuf_resize((buf), 2 * (buf)->pos); \
        } while (0)
@@ -52,6 +53,9 @@ struct sdb_strbuf {
        char  *string;
        size_t size;
        size_t pos;
+
+       /* min size to shrink the buffer to */
+       size_t min_size;
 };
 
 /*
@@ -100,7 +104,10 @@ sdb_strbuf_create(size_t size)
                }
 
                buf->string[0] = '\0';
+               buf->min_size = size;
        }
+       else
+               buf->min_size = 64;
 
        buf->size = size;
        buf->pos  = 0;