changeset 106813:4040ecb0c904

Try to fix bug#5314. This is probably not the final word, tho. * buffer.c (Fset_buffer_modified_p): Try and be careful not to modify recent-auto-save-p as a side-effect. * buffer.h (BUF_AUTOSAVE_MODIFF): New macro. * buffer.c (Fkill_buffer, reset_buffer): * editfns.c (Fsubst_char_in_region): * fileio.c (Finsert_file_contents, Fdo_auto_save) (Fset_buffer_auto_saved, Frecent_auto_save_p): Use it.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Tue, 12 Jan 2010 23:33:42 -0500
parents b727bf889482
children 84369111c005
files src/ChangeLog src/buffer.c src/buffer.h src/editfns.c src/fileio.c
diffstat 5 files changed, 63 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Wed Jan 13 10:40:39 2010 +0900
+++ b/src/ChangeLog	Tue Jan 12 23:33:42 2010 -0500
@@ -1,17 +1,28 @@
+2010-01-13  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	Try to fix bug#5314.  This is probably not the final word, tho.
+	* buffer.c (Fset_buffer_modified_p): Try and be careful not to modify
+	recent-auto-save-p as a side-effect.
+	* buffer.h (BUF_AUTOSAVE_MODIFF): New macro.
+	* buffer.c (Fkill_buffer, reset_buffer):
+	* editfns.c (Fsubst_char_in_region):
+	* fileio.c (Finsert_file_contents, Fdo_auto_save)
+	(Fset_buffer_auto_saved, Frecent_auto_save_p): Use it.
+
 2010-01-13  Kenichi Handa  <handa@m17n.org>
 
 	Display buffer name, etc. in mode line by composing correctly.
 
 	* xdisp.c (reseat_to_string): Call composition_compute_stop_pos if
 	STRING is not nil.
-	(display_mode_element): Adjusted for the change of
+	(display_mode_element): Adjust for the change of
 	decode_mode_spec and display_line.
 	(decode_mode_spec): Change arg MULTIBYTE to STRING.
 	(display_string): Handle the case that STRING is non-null and
 	LISP_STRING is not nil.
 
-	* xterm.c (x_draw_composite_glyph_string_foreground): Pay
-	attention to s->face->overstrike.
+	* xterm.c (x_draw_composite_glyph_string_foreground):
+	Pay attention to s->face->overstrike.
 
 	* composite.c (composition_reseat_it): Don't check PT if STRING is
 	non nil.
@@ -125,8 +136,8 @@
 	(x_set_window_size): ... to here. bug #2568.
 
 	* gtkutil.c (xg_clear_under_internal_border): New function.
-	(xg_frame_resized, xg_frame_set_char_size): Call
-	xg_clear_under_internal_border.
+	(xg_frame_resized, xg_frame_set_char_size):
+	Call xg_clear_under_internal_border.
 	(xg_update_scrollbar_pos): Clear under old scroll bar position.
 
 2010-01-05  Chong Yidong  <cyd@stupidchicken.com>
@@ -250,8 +261,8 @@
 	and atimer.h.
 	(minibuf.o): Depend on systime.h and coding.h.  Don't depend on
 	dispextern.h explicitly.
-	(print.o): Depend on termhooks.h, coding.h, and ccl.h.  Don't
-	depend explicitly on dispextern.h and composite.h.
+	(print.o): Depend on termhooks.h, coding.h, and ccl.h.
+	Don't depend explicitly on dispextern.h and composite.h.
 	(process.o): Depend on character.h, xgselect.h, and sysselect.h.
 	(regex.o): Don't depend on charset.h.
 	(scroll.o): Depend on systime.h, coding.h, composite.h, and window.h.
@@ -430,8 +441,8 @@
 
 2009-12-04  Eli Zaretskii  <eliz@gnu.org>
 
-	* dispextern.h (enum prop_idx) <AUTO_COMPOSED_PROP_IDX>: Delete
-	unused enumeration value.
+	* dispextern.h (enum prop_idx) <AUTO_COMPOSED_PROP_IDX>:
+	Delete unused enumeration value.
 
 2009-12-03  Eli Zaretskii  <eliz@gnu.org>
 
@@ -562,8 +573,8 @@
 
 2009-11-21  Andreas Schwab  <schwab@linux-m68k.org>
 
-	* character.h (STRING_CHAR, STRING_CHAR_AND_LENGTH): Remove
-	ignored second argument.  All callers changed.
+	* character.h (STRING_CHAR, STRING_CHAR_AND_LENGTH):
+	Remove ignored second argument.  All callers changed.
 	* regex.c (STRING_CHAR, STRING_CHAR_AND_LENGTH, RE_STRING_CHAR)
 	(RE_STRING_CHAR_AND_LENGTH): Likewise.
 	* xdisp.c (string_char_and_length): Likewise.
--- a/src/buffer.c	Wed Jan 13 10:40:39 2010 +0900
+++ b/src/buffer.c	Tue Jan 12 23:33:42 2010 -0500
@@ -1,7 +1,7 @@
 /* Buffer manipulation primitives for GNU Emacs.
    Copyright (C) 1985, 1986, 1987, 1988, 1989, 1993, 1994,
                  1995, 1997, 1998, 1999, 2000, 2001, 2002,
-                 2003, 2004, 2005, 2006, 2007, 2008, 2009
+                 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
                  Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
@@ -704,7 +704,7 @@
   b->clip_changed = 0;
   b->prevent_redisplay_optimizations_p = 1;
   b->backed_up = Qnil;
-  b->auto_save_modified = 0;
+  BUF_AUTOSAVE_MODIFF (b) = 0;
   b->auto_save_failure_time = -1;
   b->auto_save_file_name = Qnil;
   b->read_only = Qnil;
@@ -1132,7 +1132,25 @@
     }
 #endif /* CLASH_DETECTION */
 
-  SAVE_MODIFF = NILP (flag) ? MODIFF : 0;
+  /* Here we have a problem.  SAVE_MODIFF is used here to encode
+     buffer-modified-p (as SAVE_MODIFF<MODIFF) as well as
+     recent-auto-save-p (as SAVE_MODIFF<auto_save_modified).  So if we
+     modify SAVE_MODIFF to affect one, we may affect the other
+     as well.
+     E.g. if FLAG is nil we need to set SAVE_MODIFF to MODIFF, but
+     if SAVE_MODIFF<auto_save_modified that means we risk changing
+     recent-auto-save-p from t to nil.
+     Vice versa, if FLAG is non-nil and SAVE_MODIFF>=auto_save_modified
+     we risk changing recent-auto-save-p from nil to t.  */
+  SAVE_MODIFF = (NILP (flag)
+		 /* FIXME: This unavoidably sets recent-auto-save-p to nil.  */
+		 ? MODIFF
+		 /* Let's try to preserve recent-auto-save-p.  */
+		 : SAVE_MODIFF < MODIFF ? SAVE_MODIFF
+		 /* If SAVE_MODIFF == auto_save_modified == MODIFF,
+		    we can either decrease SAVE_MODIFF and auto_save_modified
+		    or increase MODIFF.  */
+		 : MODIFF++);
 
   /* Set update_mode_lines only if buffer is displayed in some window.
      Packages like jit-lock or lazy-lock preserve a buffer's modified
@@ -1541,8 +1559,8 @@
   /* Delete any auto-save file, if we saved it in this session.
      But not if the buffer is modified.  */
   if (STRINGP (b->auto_save_file_name)
-      && b->auto_save_modified != 0
-      && BUF_SAVE_MODIFF (b) < b->auto_save_modified
+      && BUF_AUTOSAVE_MODIFF (b) != 0
+      && BUF_SAVE_MODIFF (b) < BUF_AUTOSAVE_MODIFF (b)
       && BUF_SAVE_MODIFF (b) < BUF_MODIFF (b)
       && NILP (Fsymbol_value (intern ("auto-save-visited-file-name"))))
     {
--- a/src/buffer.h	Wed Jan 13 10:40:39 2010 +0900
+++ b/src/buffer.h	Tue Jan 12 23:33:42 2010 -0500
@@ -1,6 +1,6 @@
 /* Header file for the buffer manipulation primitives.
    Copyright (C) 1985, 1986, 1993, 1994, 1995, 1997, 1998, 1999, 2000, 2001,
-                 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+                 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
                  Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
@@ -158,6 +158,10 @@
 /* Overlay modification count.  */
 #define BUF_OVERLAY_MODIFF(buf) ((buf)->text->overlay_modiff)
 
+/* Modification count as of last auto-save.  */
+/* FIXME: should we move this into ->text->auto_save_modiff?  */
+#define BUF_AUTOSAVE_MODIFF(buf) ((buf)->auto_save_modified)
+
 /* Interval tree of buffer.  */
 #define BUF_INTERVALS(buf) ((buf)->text->intervals)
 
--- a/src/editfns.c	Wed Jan 13 10:40:39 2010 +0900
+++ b/src/editfns.c	Tue Jan 12 23:33:42 2010 -0500
@@ -1,7 +1,7 @@
 /* Lisp functions pertaining to editing.
    Copyright (C) 1985, 1986, 1987, 1989, 1993, 1994, 1995, 1996,
                  1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-                 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+                 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
@@ -2870,8 +2870,8 @@
 		{
 		  if (MODIFF - 1 == SAVE_MODIFF)
 		    SAVE_MODIFF++;
-		  if (MODIFF - 1 == current_buffer->auto_save_modified)
-		    current_buffer->auto_save_modified++;
+		  if (MODIFF - 1 == BUF_AUTOSAVE_MODIFF (current_buffer))
+		    BUF_AUTOSAVE_MODIFF (current_buffer)++;
 		}
 
 	      /* The before-change-function may have moved the gap
--- a/src/fileio.c	Wed Jan 13 10:40:39 2010 +0900
+++ b/src/fileio.c	Tue Jan 12 23:33:42 2010 -0500
@@ -1,7 +1,7 @@
 /* File IO for GNU Emacs.
    Copyright (C) 1985, 1986, 1987, 1988, 1993, 1994, 1995, 1996,
                  1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-                 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+                 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
@@ -4097,7 +4097,7 @@
 	}
 
       SAVE_MODIFF = MODIFF;
-      current_buffer->auto_save_modified = MODIFF;
+      BUF_AUTOSAVE_MODIFF (current_buffer) = MODIFF;
       XSETFASTINT (current_buffer->save_length, Z - BEG);
 #ifdef CLASH_DETECTION
       if (NILP (handler))
@@ -5307,7 +5307,7 @@
 	   and file changed since last real save.  */
 	if (STRINGP (b->auto_save_file_name)
 	    && BUF_SAVE_MODIFF (b) < BUF_MODIFF (b)
-	    && b->auto_save_modified < BUF_MODIFF (b)
+	    && BUF_AUTOSAVE_MODIFF (b) < BUF_MODIFF (b)
 	    /* -1 means we've turned off autosaving for a while--see below.  */
 	    && XINT (b->save_length) >= 0
 	    && (do_handled_files
@@ -5349,7 +5349,7 @@
 	      message1 ("Auto-saving...");
 	    internal_condition_case (auto_save_1, Qt, auto_save_error);
 	    auto_saved++;
-	    b->auto_save_modified = BUF_MODIFF (b);
+	    BUF_AUTOSAVE_MODIFF (b) = BUF_MODIFF (b);
 	    XSETFASTINT (current_buffer->save_length, Z - BEG);
 	    set_buffer_internal (old);
 
@@ -5394,7 +5394,9 @@
 No auto-save file will be written until the buffer changes again.  */)
      ()
 {
-  current_buffer->auto_save_modified = MODIFF;
+  /* FIXME: This should not be called in indirect buffers, since
+     they're not autosaved.  */
+  BUF_AUTOSAVE_MODIFF (current_buffer) = MODIFF;
   XSETFASTINT (current_buffer->save_length, Z - BEG);
   current_buffer->auto_save_failure_time = -1;
   return Qnil;
@@ -5417,7 +5419,9 @@
 then any auto-save counts as "recent".  */)
      ()
 {
-  return (SAVE_MODIFF < current_buffer->auto_save_modified) ? Qt : Qnil;
+  /* FIXME: maybe we should return nil for indirect buffers since
+     they're never autosaved.  */
+  return (SAVE_MODIFF < BUF_AUTOSAVE_MODIFF (current_buffer) ? Qt : Qnil);
 }
 
 /* Reading and completing file names */