Commit a1faca26 authored by Richard M. Stallman's avatar Richard M. Stallman
Browse files

(lock_superlock): Delete superlock file if it stayed

locked for 20 seconds.
parent 9614b740
......@@ -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
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment