aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorIhor Radchenko2023-10-08 11:48:42 +0300
committerEli Zaretskii2023-12-30 09:53:46 +0200
commitb7a737ef49e787120ea7a7e9f4d4ef04dd1a0723 (patch)
treef05276bb8e942e8b33a88d04b5a6beaf392028a8 /src
parent0cb252cf21efec49f693f5a8873ed02c1bcbd713 (diff)
downloademacs-b7a737ef49e787120ea7a7e9f4d4ef04dd1a0723.tar.gz
emacs-b7a737ef49e787120ea7a7e9f4d4ef04dd1a0723.zip
Improve performance of `find-buffer-visiting' (bug#66117)
* src/buffer.c (Fget_truename_buffer): Expose `get_truename_buffer' to Elisp. (Ffind_buffer): New subr searching for a live buffer with a given value of buffer-local variable. (syms_of_buffer): Register the new added subroutines. * src/filelock.c (lock_file): Use the new `Fget_truename_buffer' name. * src/lisp.h: * test/manual/etags/c-src/emacs/src/lisp.h: Remove no-longer-necessary extern declarations for `get_truename_buffer'. * lisp/files.el (find-buffer-visiting): Refactor, using subroutines to search for buffers instead of slow manual Elisp iterations.
Diffstat (limited to 'src')
-rw-r--r--src/buffer.c25
-rw-r--r--src/filelock.c2
-rw-r--r--src/lisp.h1
3 files changed, 24 insertions, 4 deletions
diff --git a/src/buffer.c b/src/buffer.c
index ea0c23192b7..73e9839f883 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -519,8 +519,11 @@ See also `find-buffer-visiting'. */)
519 return Qnil; 519 return Qnil;
520} 520}
521 521
522Lisp_Object 522DEFUN ("get-truename-buffer", Fget_truename_buffer, Sget_truename_buffer, 1, 1, 0,
523get_truename_buffer (register Lisp_Object filename) 523 doc: /* Return the buffer with `file-truename' equal to FILENAME (a string).
524If there is no such live buffer, return nil.
525See also `find-buffer-visiting'. */)
526 (register Lisp_Object filename)
524{ 527{
525 register Lisp_Object tail, buf; 528 register Lisp_Object tail, buf;
526 529
@@ -533,6 +536,22 @@ get_truename_buffer (register Lisp_Object filename)
533 return Qnil; 536 return Qnil;
534} 537}
535 538
539DEFUN ("find-buffer", Ffind_buffer, Sfind_buffer, 2, 2, 0,
540 doc: /* Return the buffer with buffer-local VARIABLE equal to VALUE.
541 If there is no such live buffer, return nil.
542See also `find-buffer-visiting'. */)
543 (Lisp_Object variable, Lisp_Object value)
544{
545 register Lisp_Object tail, buf;
546
547 FOR_EACH_LIVE_BUFFER (tail, buf)
548 {
549 if (!NILP (Fequal (value, Fbuffer_local_value(variable, buf))))
550 return buf;
551 }
552 return Qnil;
553}
554
536/* Run buffer-list-update-hook if Vrun_hooks is non-nil and BUF does 555/* Run buffer-list-update-hook if Vrun_hooks is non-nil and BUF does
537 not have buffer hooks inhibited. */ 556 not have buffer hooks inhibited. */
538 557
@@ -6010,6 +6029,8 @@ There is no reason to change that value except for debugging purposes. */);
6010 defsubr (&Sbuffer_list); 6029 defsubr (&Sbuffer_list);
6011 defsubr (&Sget_buffer); 6030 defsubr (&Sget_buffer);
6012 defsubr (&Sget_file_buffer); 6031 defsubr (&Sget_file_buffer);
6032 defsubr (&Sget_truename_buffer);
6033 defsubr (&Sfind_buffer);
6013 defsubr (&Sget_buffer_create); 6034 defsubr (&Sget_buffer_create);
6014 defsubr (&Smake_indirect_buffer); 6035 defsubr (&Smake_indirect_buffer);
6015 defsubr (&Sgenerate_new_buffer_name); 6036 defsubr (&Sgenerate_new_buffer_name);
diff --git a/src/filelock.c b/src/filelock.c
index c2b306ab47d..9ce51c724b1 100644
--- a/src/filelock.c
+++ b/src/filelock.c
@@ -563,7 +563,7 @@ lock_file (Lisp_Object fn)
563 563
564 /* See if this file is visited and has changed on disk since it was 564 /* See if this file is visited and has changed on disk since it was
565 visited. */ 565 visited. */
566 Lisp_Object subject_buf = get_truename_buffer (fn); 566 Lisp_Object subject_buf = Fget_truename_buffer (fn);
567 if (!NILP (subject_buf) 567 if (!NILP (subject_buf)
568 && NILP (Fverify_visited_file_modtime (subject_buf)) 568 && NILP (Fverify_visited_file_modtime (subject_buf))
569 && !NILP (Ffile_exists_p (fn)) 569 && !NILP (Ffile_exists_p (fn))
diff --git a/src/lisp.h b/src/lisp.h
index ed1b007d4c5..efd36465e62 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -4664,7 +4664,6 @@ extern void report_overlay_modification (Lisp_Object, Lisp_Object, bool,
4664 Lisp_Object, Lisp_Object, Lisp_Object); 4664 Lisp_Object, Lisp_Object, Lisp_Object);
4665extern bool overlay_touches_p (ptrdiff_t); 4665extern bool overlay_touches_p (ptrdiff_t);
4666extern Lisp_Object other_buffer_safely (Lisp_Object); 4666extern Lisp_Object other_buffer_safely (Lisp_Object);
4667extern Lisp_Object get_truename_buffer (Lisp_Object);
4668extern void init_buffer_once (void); 4667extern void init_buffer_once (void);
4669extern void init_buffer (void); 4668extern void init_buffer (void);
4670extern void syms_of_buffer (void); 4669extern void syms_of_buffer (void);