Lisp_Object Qask_user_about_supersession_threat;
Lisp_Object Qask_user_about_lock;
+int inhibit_clash_detection;
#ifdef CLASH_DETECTION
if (STRINGP (Fsystem_name ())
&& strcmp (owner->host, (char *) XSTRING_DATA (Fsystem_name ())) == 0)
{
- if (owner->pid == getpid ())
+ if (owner->pid == (unsigned long) getpid ())
ret = 2; /* We own it. */
else if (owner->pid > 0
&& (kill (owner->pid, 0) >= 0 || errno == EPERM))
register Lisp_Object attack, orig_fn;
register char *lfname, *locker;
lock_info_type lock_info;
- struct gcpro gcpro1,gcpro2;
+ struct gcpro gcpro1, gcpro2, gcpro3;
+ Lisp_Object old_current_buffer;
Lisp_Object subject_buf;
- GCPRO2 (fn, subject_buf);
+ if (inhibit_clash_detection)
+ return;
+
+ XSETBUFFER (old_current_buffer, current_buffer);
+ subject_buf = Qnil;
+ GCPRO3 (fn, subject_buf, old_current_buffer);
orig_fn = fn;
fn = Fexpand_file_name (fn, Qnil);
}
/* Try to lock the lock. */
- if (lock_if_free (&lock_info, lfname) <= 0)
- /* Return now if we have locked it, or if lock creation failed */
+ if (current_buffer != XBUFFER (old_current_buffer)
+ || lock_if_free (&lock_info, lfname) <= 0)
+ /* Return now if we have locked it, or if lock creation failed
+ or current buffer is killed. */
goto done;
/* Else consider breaking the lock */
attack = call2_in_buffer (BUFFERP (subject_buf) ? XBUFFER (subject_buf) :
current_buffer, Qask_user_about_lock , fn,
build_string (locker));
- if (!NILP (attack))
+ if (!NILP (attack) && current_buffer == XBUFFER (old_current_buffer))
/* User says take the lock */
{
lock_file_1 (lfname, 1);
defsymbol (&Qask_user_about_lock, "ask-user-about-lock");
}
+void
+vars_of_filelock (void)
+{
+ DEFVAR_BOOL ("inhibit-clash-detection", &inhibit_clash_detection /*
+Non-nil inhibits creation of lock file to detect clash.
+*/);
+ inhibit_clash_detection = 0;
+}
#endif /* CLASH_DETECTION */