aboutsummaryrefslogtreecommitdiffstats
path: root/src/buffer.c
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/buffer.c
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/buffer.c')
-rw-r--r--src/buffer.c25
1 files changed, 23 insertions, 2 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);