unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Paul Eggert <eggert@cs.ucla.edu>
To: Eli Zaretskii <eliz@gnu.org>
Cc: 13149@debbugs.gnu.org, dgutov@yandex.ru
Subject: bug#13149: 24.3.50; Emacs thinks file was changed outside Emacs, but it was not
Date: Sat, 02 Feb 2013 11:31:34 -0800	[thread overview]
Message-ID: <510D6996.4050705@cs.ucla.edu> (raw)
In-Reply-To: <83k3qrawcu.fsf@gnu.org>

On 02/02/2013 01:38 AM, Eli Zaretskii wrote:
> My testing indicates that a file on NTFS has its time stamp changed in
> this scenario, while a file on FAT32 will not.

OK, thanks, then we need to check for that problem too.

Rather than go through a lengthy remote debugging session
with Drew, I'm inclined to disable the heuristic
on MS-Windows, as that should fix the problem once
and for all.  That is, we just live with the race conditions
on MS-Windows (which is what Emacs users have done for many years)
and fix the race conditions only on GNU and other systems
that support POSIX.1-2008 well.

I installed the following patch to try to do that, as trunk
bzr 111664.  If Drew continues to have the problem even with
this patch, we can investigate further by inserting some
logging code along the lines that we discussed.

=== modified file 'src/ChangeLog'
--- src/ChangeLog	2013-02-02 17:14:24 +0000
+++ src/ChangeLog	2013-02-02 19:18:00 +0000
@@ -1,3 +1,14 @@
+2013-02-02  Paul Eggert  <eggert@cs.ucla.edu>
+
+	Avoid file time stamp bug on MS-Windows (Bug#13149).
+	* fileio.c (Fwrite_region): Don't use the heuristic on empty files,
+	as FAT32 doesn't update time stamps when truncating them.
+	Also, check that a file time stamp is not a multiple of 100 ns;
+	this should catch all instances of the problem on MS-Windows,
+	as its native file system resolution is 100 ns or worse, and
+	checking for a non-multiple of 100 ns should impose only a small
+	overhead on systems with ns resolution.
+
 2013-02-02  Eli Zaretskii  <eliz@gnu.org>
 
 	Avoid encoding file names on MS-Windows when they need to be run

=== modified file 'src/fileio.c'
--- src/fileio.c	2013-02-02 17:14:24 +0000
+++ src/fileio.c	2013-02-02 19:18:00 +0000
@@ -5020,11 +5020,22 @@
 	  if (fstat (desc1, &st1) == 0
 	      && st.st_dev == st1.st_dev && st.st_ino == st1.st_ino)
 	    {
+	      /* Use the heuristic if it appears to be valid.  With neither
+		 O_EXCL nor O_TRUNC, if Emacs happened to write nothing to the
+		 file, the time stamp won't change.  Also, some non-POSIX
+		 systems don't update an empty file's time stamp when
+		 truncating it.  Finally, file systems with 100 ns or worse
+		 resolution sometimes seem to have bugs: on a system with ns
+		 resolution, checking ns % 100 incorrectly avoids the heuristic
+		 1% of the time, but the problem should be temporary as we will
+		 try again on the next time stamp.  */
+	      bool use_heuristic
+		= ((open_flags & (O_EXCL | O_TRUNC)) != 0
+		   && st.st_size != 0
+		   && EMACS_NSECS (modtime) % 100 != 0);
+
 	      EMACS_TIME modtime1 = get_stat_mtime (&st1);
-	      /* If neither O_EXCL nor O_TRUNC is used, and Emacs happened to
-		 write nothing to the file, the file's time stamp won't change
-		 so it should not be used in this heuristic.  */
-	      if ((open_flags & (O_EXCL | O_TRUNC)) != 0
+	      if (use_heuristic
 		  && EMACS_TIME_EQ (modtime, modtime1)
 		  && st.st_size == st1.st_size)
 		{







  reply	other threads:[~2013-02-02 19:31 UTC|newest]

Thread overview: 68+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-12-11 21:51 bug#13149: 24.3.50; Emacs thinks file was changed outside Emacs, but it was not Drew Adams
2012-12-11 22:48 ` Dmitry Gutov
2012-12-11 22:54   ` Drew Adams
2013-01-14  5:10     ` Dmitry Gutov
2013-01-14 14:57       ` Dmitry Gutov
2013-01-14 17:02         ` Eli Zaretskii
2013-01-14 22:22           ` Dmitry Gutov
2013-01-14 18:28         ` Paul Eggert
2013-01-14 22:20           ` Dmitry Gutov
2013-01-15  6:45             ` Paul Eggert
2013-01-15  8:54               ` Dmitry Gutov
2013-01-15 17:31                 ` Paul Eggert
2013-01-15 21:38                   ` Dmitry Gutov
2013-01-15 21:47                     ` Paul Eggert
2013-01-15 22:11                       ` Dmitry Gutov
2013-01-15 22:38                         ` Paul Eggert
2013-01-15 23:09                           ` Dmitry Gutov
2013-01-15 23:44                             ` Dmitry Gutov
2013-01-16  5:57                               ` Paul Eggert
2013-01-17 10:32                                 ` Dmitry Gutov
2013-01-17 17:05                                   ` Eli Zaretskii
2013-01-18  4:15                                     ` Dmitry Gutov
2013-01-18  7:49                                       ` Eli Zaretskii
2013-01-17 21:14                                   ` Paul Eggert
2013-01-18  4:55                                     ` Dmitry Gutov
2013-01-18  5:26                                       ` Paul Eggert
2013-01-17 21:33                                   ` Paul Eggert
2013-01-18  4:36                                     ` Dmitry Gutov
2013-01-18  5:01                                       ` Paul Eggert
2013-01-18  5:10                                         ` Dmitry Gutov
2013-01-18  5:25                                           ` Paul Eggert
2013-01-18  5:54                                             ` Dmitry Gutov
2013-01-18  6:22                                               ` Dmitry Gutov
2013-01-18  7:56                                             ` Eli Zaretskii
2013-01-18 14:45                                               ` Dmitry Gutov
2013-01-18 21:35                                               ` Paul Eggert
2013-01-18 22:52                                                 ` Dmitry Gutov
2013-01-19  0:55                                                   ` Paul Eggert
2013-01-19  1:09                                                     ` Dmitry Gutov
2013-01-19  2:37                                                       ` Paul Eggert
2013-01-19  4:02                                                         ` Dmitry Gutov
2013-01-19  4:51                                                           ` Paul Eggert
     [not found]                                                             ` <DEB91990BBBB4255BFB466956EB54214@us.oracl!e.com>
     [not found]                                                             ` <DEB91990BBBB4255BFB466956EB54214@us.oracl!>
     [not found]                                                               ` <e.com@[87.69.4.28]>
     [not found]                                                                 ` <83wq! urc1u3.fsf@gnu.org>
     [not found]                                                             ` <DEB91990BBBB4255BFB466956EB54214@us.oracl! e.com>
     [not found]                                                             ` <DEB91990BBBB4255BFB466956! EB54214@us.oracl!>
2013-01-19  5:02                                                             ` Drew Adams
2013-02-01 16:32                                                               ` Drew Adams
2013-02-01 16:43                                                                 ` Drew Adams
2013-02-01 16:49                                                                   ` Drew Adams
2013-02-01 18:43                                                                 ` Eli Zaretskii
2013-02-01 19:19                                                                   ` Drew Adams
2013-02-01 19:36                                                                     ` Eli Zaretskii
2013-02-01 22:15                                                                       ` Drew Adams
2013-02-02  9:41                                                                         ` Eli Zaretskii
2013-02-02 16:06                                                                           ` Drew Adams
2013-02-01 19:38                                                                     ` Eli Zaretskii
2013-02-01 22:13                                                                       ` Drew Adams
2013-02-01 21:05                                                                 ` Paul Eggert
2013-02-01 22:14                                                                   ` Drew Adams
2013-02-01 22:22                                                                     ` Paul Eggert
2013-02-02  9:43                                                                       ` Eli Zaretskii
2013-03-19  8:39                                                                         ` Uwe Siart
2013-03-19 16:55                                                                           ` Eli Zaretskii
2013-03-19 17:50                                                                             ` Uwe Siart
2014-02-06  1:40                                                                             ` Lars Ingebrigtsen
2014-02-06  6:12                                                                               ` Drew Adams
2014-02-06  6:19                                                                               ` Eli Zaretskii
2013-02-02  9:38                                                                   ` Eli Zaretskii
2013-02-02 19:31                                                                     ` Paul Eggert [this message]
2013-01-18  7:57                                       ` Eli Zaretskii
2013-01-17 17:16                                 ` David Engster

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=510D6996.4050705@cs.ucla.edu \
    --to=eggert@cs.ucla.edu \
    --cc=13149@debbugs.gnu.org \
    --cc=dgutov@yandex.ru \
    --cc=eliz@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).