summaryrefslogtreecommitdiff
path: root/src/filelock.c
diff options
context:
space:
mode:
authorKarl Heuer <kwzh@gnu.org>1994-03-11 02:35:50 +0000
committerKarl Heuer <kwzh@gnu.org>1994-03-11 02:35:50 +0000
commit71539e0d02226949bc411c609a8126e77bc4b8f6 (patch)
tree3b719869232d121389ba1155da18bbcb85153a89 /src/filelock.c
parent6b732b0437eeb2b78995dd240c569fc7d3722ef0 (diff)
downloademacs-71539e0d02226949bc411c609a8126e77bc4b8f6.tar.gz
(lock_superlock): Synchronize NFS cache.
Diffstat (limited to 'src/filelock.c')
-rw-r--r--src/filelock.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/filelock.c b/src/filelock.c
index 52349ffa872..48d1f0f758b 100644
--- a/src/filelock.c
+++ b/src/filelock.c
@@ -37,6 +37,23 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#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 @@ lock_superlock (lfname)
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 @@ lock_superlock (lfname)
{
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)