From e0fead5d9f0536f821b870eea67c1a399111ceea Mon Sep 17 00:00:00 2001 From: Andrew Innes Date: Wed, 5 Dec 2001 21:39:01 +0000 Subject: [PATCH] (Fgarbage_collect): Shrink buffer gaps that are excessively large. --- src/ChangeLog | 10 ++++++++++ src/alloc.c | 20 +++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/ChangeLog b/src/ChangeLog index 97e037feec5..b6d2ba07151 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,13 @@ +2001-12-05 Andrew Innes + + * alloc.c (Fgarbage_collect): Shrink buffer gaps that are + excessively large. + + * insdel.c (make_gap_larger): New function. + (make_gap_smaller): New function. + (make_gap) [USE_MMAP_FOR_BUFFERS || REL_ALLOC]: Call + make_gap_smaller if arg is negative. + 2001-12-04 Stefan Monnier * keyboard.c (kbd_buffer_store_event): Fix interrupt_signal prototype. diff --git a/src/alloc.c b/src/alloc.c index 94ad4d59df7..6a47b872d23 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -1020,7 +1020,7 @@ make_number (n) /* Lisp_Strings are allocated in string_block structures. When a new string_block is allocated, all the Lisp_Strings it contains are - added to a free-list stiing_free_list. When a new Lisp_String is + added to a free-list string_free_list. When a new Lisp_String is needed, it is taken from that list. During the sweep phase of GC, string_blocks that are entirely free are freed, except two which we keep. @@ -4096,6 +4096,24 @@ Garbage collection happens automatically if you cons more than nextb->undo_list = truncate_undo_list (nextb->undo_list, undo_limit, undo_strong_limit); + + /* Shrink buffer gaps, but skip indirect and dead buffers. */ + if (nextb->base_buffer == 0 && !NILP (nextb->name)) + { + /* If a buffer's gap size is more than 10% of the buffer + size, or larger than 2000 bytes, then shrink it + accordingly. Keep a minimum size of 20 bytes. */ + int size = min (2000, max (20, (nextb->text->z_byte / 10))); + + if (nextb->text->gap_size > size) + { + struct buffer *save_current = current_buffer; + current_buffer = nextb; + make_gap (-(nextb->text->gap_size - size)); + current_buffer = save_current; + } + } + nextb = nextb->next; } } -- 2.39.2