changeset 55839:9e7829a684df

(truncate_undo_list): New arg LIMITSIZE.
author Richard M. Stallman <rms@gnu.org>
date Sat, 29 May 2004 16:20:47 +0000
parents ca648e6d2d7b
children e2775bcb9a2e
files src/undo.c
diffstat 1 files changed, 16 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/undo.c	Sat May 29 16:19:41 2004 +0000
+++ b/src/undo.c	Sat May 29 16:20:47 2004 +0000
@@ -292,14 +292,15 @@
 
 /* At garbage collection time, make an undo list shorter at the end,
    returning the truncated list.
-   MINSIZE and MAXSIZE are the limits on size allowed, as described below.
-   In practice, these are the values of undo-limit and
-   undo-strong-limit.  */
+   MINSIZE, MAXSIZE and LIMITSIZE are the limits on size allowed,
+   as described below.
+   In practice, these are the values of undo-limit,
+   undo-strong-limit, and undo-outer-limit.  */
 
 Lisp_Object
-truncate_undo_list (list, minsize, maxsize)
+truncate_undo_list (list, minsize, maxsize, limitsize)
      Lisp_Object list;
-     int minsize, maxsize;
+     int minsize, maxsize, limitsize;
 {
   Lisp_Object prev, next, last_boundary;
   int size_so_far = 0;
@@ -308,7 +309,8 @@
   next = list;
   last_boundary = Qnil;
 
-  /* Always preserve at least the most recent undo record.
+  /* Always preserve at least the most recent undo record
+     unless it is really horribly big.
      If the first element is an undo boundary, skip past it.
 
      Skip, skip, skip the undo, skip, skip, skip the undo,
@@ -323,6 +325,7 @@
       prev = next;
       next = XCDR (next);
     }
+
   while (CONSP (next) && ! NILP (XCAR (next)))
     {
       Lisp_Object elt;
@@ -338,13 +341,20 @@
 			    + SCHARS (XCAR (elt)));
 	}
 
+      /* If we reach LIMITSIZE before the first boundary,
+	 we're heading for memory full, so truncate the list to nothing.  */
+      if (size_so_far > limitsize)
+	return Qnil;
+
       /* Advance to next element.  */
       prev = next;
       next = XCDR (next);
     }
+
   if (CONSP (next))
     last_boundary = prev;
 
+  /* Keep more if it fits.  */
   while (CONSP (next))
     {
       Lisp_Object elt;