emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

emacs-29 bbe35c280c: Prevent stale servers when using eglot-extend-to-xr


From: João Távora
Subject: emacs-29 bbe35c280c: Prevent stale servers when using eglot-extend-to-xref
Date: Thu, 22 Dec 2022 06:29:32 -0500 (EST)

branch: emacs-29
commit bbe35c280c2bf9fb2fd9b6e33b2950b8fae67e2c
Author: João Távora <joaotavora@gmail.com>
Commit: João Távora <joaotavora@gmail.com>

    Prevent stale servers when using eglot-extend-to-xref
    
    A weak-valued hash-table is not enough to guarantee that a reference
    to a zombie server in eglot--servers-by-xrefed-file variable won't
    survive long enough to confuse the next call to eglot--current-server
    in some buffers.
    
    So, before this fix it was common to get "Process EGLOT ... not
    running" errors if some xref-extended buffers (like system libraries)
    were open and M-x eglot-reconnect was issued.  This should be
    prevented now.
    
    Note however, that even after this the eglot-extend-to-xref logic is
    still flawed.  For example, if a buffer for the xref-extended buffer
    happens to be already visited by the time M-. is issued to navigate to
    it, Eglot won't be activated.  A half-decent workaround is to kill the
    buffer and re-visit it.
    
    * lisp/progmodes/eglot.el (eglot--servers-by-xrefed-file): Move
    up.
    (eglot--on-shutdown): Make sure to cleanup
    eglot--servers-by-xrefed-file.
---
 lisp/progmodes/eglot.el | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el
index 0f1bfd0447..e7782ea811 100644
--- a/lisp/progmodes/eglot.el
+++ b/lisp/progmodes/eglot.el
@@ -908,6 +908,9 @@ PRESERVE-BUFFERS as in `eglot-shutdown', which see."
            do (with-demoted-errors "[eglot] shutdown all: %s"
                 (cl-loop for s in ss do (eglot-shutdown s nil nil 
preserve-buffers)))))
 
+(defvar eglot--servers-by-xrefed-file
+  (make-hash-table :test 'equal :weakness 'value))
+
 (defun eglot--on-shutdown (server)
   "Called by jsonrpc.el when SERVER is already dead."
   ;; Turn off `eglot--managed-mode' where appropriate.
@@ -926,6 +929,9 @@ PRESERVE-BUFFERS as in `eglot-shutdown', which see."
   (setf (gethash (eglot--project server) eglot--servers-by-project)
         (delq server
               (gethash (eglot--project server) eglot--servers-by-project)))
+  (maphash (lambda (f s)
+             (when (eq s server) (remhash f eglot--servers-by-xrefed-file)))
+           eglot--servers-by-xrefed-file)
   (cond ((eglot--shutdown-requested server)
          t)
         ((not (eglot--inhibit-autoreconnect server))
@@ -1057,9 +1063,6 @@ be guessed."
 (put 'eglot-lsp-context 'variable-documentation
      "Dynamically non-nil when searching for projects in LSP context.")
 
-(defvar eglot--servers-by-xrefed-file
-  (make-hash-table :test 'equal :weakness 'value))
-
 (defun eglot--current-project ()
   "Return a project object for Eglot's LSP purposes.
 This relies on `project-current' and thus on



reply via email to

[Prev in Thread] Current Thread [Next in Thread]