summaryrefslogtreecommitdiff
path: root/lisp/jsonrpc.el
diff options
context:
space:
mode:
authorJoão Távora <joaotavora@gmail.com>2018-12-16 16:55:09 +0000
committerJoão Távora <joaotavora@gmail.com>2018-12-16 16:55:38 +0000
commit2f65525774b6e7edf119db678c9eb78cbb84de6a (patch)
tree5441cfec006b7db8f6511404a15e01e70164cbd3 /lisp/jsonrpc.el
parentf74595aace4b1240402562b0073b06c170969327 (diff)
downloademacs-2f65525774b6e7edf119db678c9eb78cbb84de6a.tar.gz
Jsonrpc error handlers can now safely call jsonrpc-shutdown
Previously, if an error handler called jsonrpc-shutdown, and if that error handler was being called from the process sentinel, jsonrpc-shutdown would infloop waiting for jsonrpc-sentinel-done to be set. Rename the process property jsonrpc-sentinel-done to jsonrpc-sentinel-cleanup-started, arrange for it to be set earlier in the sentinel, and also check for it earlier in jsonrpc-shutdown. * lisp/jsonrpc.el (Version): Bump to 1.0.7. (jsonrpc--process-sentinel): Set jsonrpc-sentinel-cleanup-started a bit earlier than previous jsonrpc-sentinel-done. (jsonrpc-shutdown): Query jsonrpc-sentinel-cleanup-started
Diffstat (limited to 'lisp/jsonrpc.el')
-rw-r--r--lisp/jsonrpc.el14
1 files changed, 7 insertions, 7 deletions
diff --git a/lisp/jsonrpc.el b/lisp/jsonrpc.el
index 020d7f56cc4..af69aa4dfd5 100644
--- a/lisp/jsonrpc.el
+++ b/lisp/jsonrpc.el
@@ -6,7 +6,7 @@
;; Maintainer: João Távora <joaotavora@gmail.com>
;; Keywords: processes, languages, extensions
;; Package-Requires: ((emacs "25.2"))
-;; Version: 1.0.6
+;; Version: 1.0.7
;; This is an Elpa :core package. Don't use functionality that is not
;; compatible with Emacs 25.2.
@@ -421,13 +421,13 @@ connection object, called when the process dies .")
With optional CLEANUP, kill any associated buffers. "
(unwind-protect
(cl-loop
- with proc = (jsonrpc--process conn)
+ with proc = (jsonrpc--process conn) for i from 0
+ while (not (process-get proc 'jsonrpc-sentinel-cleanup-started))
+ unless (zerop i) do
+ (jsonrpc--warn "Sentinel for %s still hasn't run, deleting it!" proc)
do
(delete-process proc)
- (accept-process-output nil 0.1)
- while (not (process-get proc 'jsonrpc-sentinel-done))
- do (jsonrpc--warn
- "Sentinel for %s still hasn't run, deleting it!" proc))
+ (accept-process-output nil 0.1))
(when cleanup
(kill-buffer (process-buffer (jsonrpc--process conn)))
(kill-buffer (jsonrpc-stderr-buffer conn)))))
@@ -486,6 +486,7 @@ With optional CLEANUP, kill any associated buffers. "
(pcase-let ((`(,_success ,_error ,timeout) triplet))
(when timeout (cancel-timer timeout))))
(jsonrpc--request-continuations connection))
+ (process-put proc 'jsonrpc-sentinel-cleanup-started t)
(unwind-protect
;; Call all outstanding error handlers
(maphash (lambda (_id triplet)
@@ -493,7 +494,6 @@ With optional CLEANUP, kill any associated buffers. "
(funcall error '(:code -1 :message "Server died"))))
(jsonrpc--request-continuations connection))
(jsonrpc--message "Server exited with status %s" (process-exit-status proc))
- (process-put proc 'jsonrpc-sentinel-done t)
(delete-process proc)
(funcall (jsonrpc--on-shutdown connection) connection)))))