summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard M. Stallman <rms@gnu.org>1996-09-12 17:29:17 +0000
committerRichard M. Stallman <rms@gnu.org>1996-09-12 17:29:17 +0000
commit983cac0b57f374afa6318261bc0338136bb48cac (patch)
treedf581c3c228f6b277574133cc00cb72c879acbdf
parent54fec4c0f2796815d1e81065f09fb4eb9ac367e6 (diff)
downloademacs-983cac0b57f374afa6318261bc0338136bb48cac.tar.gz
(lock_superlock): Delete superlock file if it stayed
locked for 20 seconds.
-rw-r--r--src/filelock.c54
1 files changed, 43 insertions, 11 deletions
diff --git a/src/filelock.c b/src/filelock.c
index 5393867063c..6c1b6b2a1c4 100644
--- a/src/filelock.c
+++ b/src/filelock.c
@@ -353,32 +353,64 @@ lock_superlock (lfname)
{
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