changeset 6300:0aa51282fbfe

(lock_superlock): Synchronize NFS cache.
author Karl Heuer <kwzh@gnu.org>
date Fri, 11 Mar 1994 02:35:50 +0000
parents d0a9fa0d0a8d
children 80e3ee8d618d
files src/filelock.c
diffstat 1 files changed, 25 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/filelock.c	Thu Mar 10 23:57:21 1994 +0000
+++ b/src/filelock.c	Fri Mar 11 02:35:50 1994 +0000
@@ -37,6 +37,23 @@
 #include <paths.h>
 #include "buffer.h"
 
+#ifdef SYSV_SYSTEM_DIR
+#include <dirent.h>
+#else /* not SYSV_SYSTEM_DIR */
+#ifdef NONSYSTEM_DIR_LIBRARY
+#include "ndir.h"
+#else /* not NONSYSTEM_DIR_LIBRARY */
+#ifdef MSDOS
+#include <dirent.h>
+#else
+#include <sys/dir.h>
+#endif
+#endif /* not NONSYSTEM_DIR_LIBRARY */
+#ifndef MSDOS
+extern DIR *opendir ();
+#endif /* not MSDOS */
+#endif /* not SYSV_SYSTEM_DIR */
+
 extern int errno;
 
 extern char *egetenv ();
@@ -325,6 +342,7 @@
      char *lfname;
 {
   register int i, fd;
+  DIR *lockdir;
 
   for (i = -20; i < 0 && (fd = open (superlock_path,
 				     O_WRONLY | O_EXCL | O_CREAT, 0666)) < 0;
@@ -332,6 +350,13 @@
     {
       if (errno != EEXIST)
 	return;
+
+      /* 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_path))
+	closedir (lockdir);
+
       sleep (1);
     }
   if (fd >= 0)