mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-01-30 04:10:54 -08:00
(lock_superlock): Synchronize NFS cache.
This commit is contained in:
parent
6483e43f34
commit
25bef3dd72
1 changed files with 25 additions and 0 deletions
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue