]> git.ipfire.org Git - pakfire.git/commitdiff
buffer: Automatically shrink the buffer
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 22 Mar 2025 18:21:02 +0000 (18:21 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 22 Mar 2025 18:21:02 +0000 (18:21 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/pakfire/buffer.c

index de99b0ea9180afb20572d0bef399f90b7a1a3299..55db5e8890ea0fb3282cf823e697dd85b93bb048 100644 (file)
@@ -27,6 +27,9 @@
 // Use chunks of 4k size
 #define CHUNK_SIZE 4096
 
+// Shrink the buffer once we are wasting more than this
+#define MAX_WASTAGE (CHUNK_SIZE * 8)
+
 void pakfire_buffer_set_max_length(struct pakfire_buffer* self, size_t max_length) {
        self->max_length = max_length;
 }
@@ -71,7 +74,11 @@ static int pakfire_buffer_grow(struct pakfire_buffer* self, size_t length) {
 
 // Shrinks the buffer to its minimum size
 static int pakfire_buffer_shrink(struct pakfire_buffer* self) {
-       return pakfire_buffer_resize(self, self->length);
+       // Shrink whenever we hit the wastage level
+       if (self->length - self->used < MAX_WASTAGE)
+               return 0;
+
+       return pakfire_buffer_resize(self, self->used);
 }
 
 int pakfire_buffer_push(struct pakfire_buffer* self, const char* data, size_t length) {
@@ -132,7 +139,8 @@ int pakfire_buffer_pop(struct pakfire_buffer* self, size_t length) {
        memmove(self->data, self->data + length, self->used - length);
        self->used -= length;
 
-       return 0;
+       // Shrink the buffer if we need to
+       return pakfire_buffer_shrink(self);
 }
 
 size_t pakfire_buffer_find_line(struct pakfire_buffer* self) {