branch: externals/eglot commit c417eb4343ff76c18d323dd2a9861526940551f0 Author: João Távora <joaotav...@gmail.com> Commit: João Távora <joaotav...@gmail.com>
Cancel timeouts when process dies unexpectedly --- eglot.el | 53 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 21 deletions(-) diff --git a/eglot.el b/eglot.el index e3b288b..5699775 100644 --- a/eglot.el +++ b/eglot.el @@ -153,9 +153,16 @@ (with-current-buffer (process-buffer process) (eglot--debug "Process state changed to %s" change) (when (not (process-live-p process)) + ;; Remember to cancel all timers + ;; + (maphash (lambda (id v) + (cl-destructuring-bind (_success _error timeout) v + (eglot--message "Cancelling timer for continuation %s" id) + (cancel-timer timeout))) + (eglot--pending-continuations process)) (cond ((process-get process 'eglot--moribund) (eglot--message "Process exited with status %s" - (process-exit-status process))) + (process-exit-status process))) (t (eglot--warn "Process unexpectedly changed to %s" change)))))) @@ -319,26 +326,30 @@ :method ,method :params ,params)) (catch catch-tag - (puthash id - (list (if async-p - success-fn - (lambda (&rest args) - (throw catch-tag (apply success-fn args)))) - (if async-p - error-fn - (lambda (&rest args) - (throw catch-tag (apply error-fn args)))) - (run-with-timer 5 nil - (if async-p - timeout-fn - (lambda () - (throw catch-tag (apply timeout-fn)))))) - (eglot--pending-continuations process)) - (unless async-p - (while t - (unless (eq (process-status process) 'open) - (eglot--error "Process %s died unexpectedly" process)) - (accept-process-output nil 0.01)))))) + (let ((timeout-timer + (run-with-timer 5 nil + (if async-p + timeout-fn + (lambda () + (throw catch-tag (apply timeout-fn))))))) + (puthash id + (list (if async-p + success-fn + (lambda (&rest args) + (throw catch-tag (apply success-fn args)))) + (if async-p + error-fn + (lambda (&rest args) + (throw catch-tag (apply error-fn args)))) + timeout-timer) + (eglot--pending-continuations process)) + (unless async-p + (unwind-protect + (while t + (unless (process-live-p process) + (eglot--error "Process %s died unexpectedly" process)) + (accept-process-output nil 0.01)) + (cancel-timer timeout-timer))))))) ;;; Requests