|
@@ -254,9 +254,10 @@ buf_get_initial_mem(buf_t *buf, size_t sz)
|
|
|
}
|
|
|
|
|
|
|
|
|
- * last call to this function. */
|
|
|
+ * last call to this function. If <b>free_all</b>, we're exiting and we
|
|
|
+ * should clear the whole lists. */
|
|
|
void
|
|
|
-buf_shrink_freelists(void)
|
|
|
+buf_shrink_freelists(int free_all)
|
|
|
{
|
|
|
int j;
|
|
|
for (j = 0; j < 2; ++j) {
|
|
@@ -267,8 +268,10 @@ buf_shrink_freelists(void)
|
|
|
log_info(LD_GENERAL, "We haven't used %d/%d allocated %d-byte buffer "
|
|
|
"memory chunks since the last call; freeing all but %d of them",
|
|
|
list->lowwater, list->len, (int)list->chunksize, list->slack);
|
|
|
-
|
|
|
- n_to_free = list->lowwater - list->slack;
|
|
|
+ if (free_all)
|
|
|
+ n_to_free = list->len;
|
|
|
+ else
|
|
|
+ n_to_free = list->lowwater - list->slack;
|
|
|
n_to_skip = list->len - n_to_free;
|
|
|
for (ptr = &list->list, i = 0; i < n_to_skip; ++i) {
|
|
|
char *mem = *ptr;
|