changeset 16172:b7131e99a796

(lock_superlock): Delete superlock file if it stayed locked for 20 seconds.
author Richard M. Stallman <rms@gnu.org>
date Thu, 12 Sep 1996 17:29:17 +0000
parents 919ed1778c0b
children 9ba176963a26
files src/filelock.c
diffstat 1 files changed, 43 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/src/filelock.c	Thu Sep 12 17:28:54 1996 +0000
+++ b/src/filelock.c	Thu Sep 12 17:29:17 1996 +0000
@@ -353,32 +353,64 @@
 {
   register int i, fd;
   DIR *lockdir;
+  struct stat first_stat, last_stat;
 
-  for (i = -20; i < 0 && (fd = open (superlock_file,
-				     O_WRONLY | O_EXCL | O_CREAT, 0666)) < 0;
+  for (i = -20; i < 0;
        i++)
     {
+      fd = open (superlock_file,
+		 O_WRONLY | O_EXCL | O_CREAT, 0666);
+
+      /* If we succeeded in creating the superlock, we win.
+	 Fill in our info and return.  */
+      if (fd >= 0)
+	{
+#ifdef USG
+	  chmod (superlock_file, 0666);
+#else
+	  fchmod (fd, 0666);
+#endif
+	  write (fd, lfname, strlen (lfname));
+	  close (fd);
+	  return;
+	}
+
+      /* If the problem is not just that it is already locked,
+	 give up.  */
       if (errno != EEXIST)
 	return;
 
+      message ("Superlock file exists, retrying...");
+
+      if (i == -20)
+	stat (superlock_file, &first_stat);
+
+      if (i == -1)
+	stat (superlock_file, &last_stat);
+
       /* This seems to be necessary to prevent Emacs from hanging when the
 	 competing process has already deleted the superlock, but it's still
 	 in the NFS cache.  So we force NFS to synchronize the cache.  */
-      if (lockdir = opendir (lock_dir))
+      lockdir = opendir (lock_dir);
+
+      if (lockdir)
 	closedir (lockdir);
 
       sleep (1);
     }
-  if (fd >= 0)
+
+  if (first_stat.st_ctime == last_stat.st_ctime)
     {
-#ifdef USG
-      chmod (superlock_file, 0666);
-#else
-      fchmod (fd, 0666);
-#endif
-      write (fd, lfname, strlen (lfname));
-      close (fd);
+      int value;
+      value = unlink (superlock_file);
+
+      if (value != -1)
+	message ("Superlock file deleted");
+      else
+	message ("Failed to delete superlock file");
     }
+  else
+    message ("Giving up on the superlock file");
 }
 
 void