// 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;
}
// 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) {
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) {