From b2ea73ca9c80d1f20b4939eacf235dba05fc1aaf Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jo=C3=A3o=20T=C3=A1vora?= Date: Wed, 16 Aug 2017 12:58:20 +0100 Subject: [PATCH] Cancel timeouts when process dies unexpectedly --- lisp/progmodes/eglot.el | 53 +++++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 21 deletions(-) diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el index e3b288b0381..5699775a2bb 100644 --- a/lisp/progmodes/eglot.el +++ b/lisp/progmodes/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 -- 2.39.2