branch: elpa/request commit 5381058499f02c01930dda2f1fa452aa06023b41 Author: dickmao <none> Commit: dickmao <none>
Thread switches result in (process-buffer proc) being nil These have resulted in dreaded "semaphore never called nil nil". --- request.el | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/request.el b/request.el index 95b7003e5b..459ffaa1d1 100644 --- a/request.el +++ b/request.el @@ -584,11 +584,13 @@ and requests.request_ (Python). "Parse BUFFER according to PARSER. Delegate to callbacks SUCCESS, ERROR, and COMPLETE the STATUS-CODE of RESPONSE via ENCODING." + (when (buffer-live-p buffer) + ;; questionable whether BUFFER should override RESPONSE. + (setf (request-response--buffer response) buffer)) (request-log 'debug "request--callback: UNPARSED\n%s" - (when (buffer-live-p buffer) - (with-current-buffer buffer (buffer-string)))) - ;; Reset RESPONSE buffer to argument BUFFER. - (setf (request-response--buffer response) buffer) + (when (buffer-live-p (request-response--buffer response)) + (with-current-buffer (request-response--buffer response) + (buffer-string)))) (cl-symbol-macrolet ((timer (request-response--timer response))) (when timer (cancel-timer timer) @@ -610,7 +612,7 @@ RESPONSE via ENCODING." (request--parse-data response encoding parser) (error (unless error-thrown (setq error-thrown err)) (unless symbol-status (setq symbol-status 'parse-error)))) - (kill-buffer buffer) + (kill-buffer (request-response--buffer response)) ;; Ensuring `symbol-status' and `error-thrown' are consistent ;; is why we should get rid of `symbol-status' @@ -1112,8 +1114,11 @@ START-URL is the URL requested." (defun request--curl-callback (url proc event) "Ensure `request--callback' gets called after curl to URL finishes. See info entries on sentinels regarding PROC and EVENT." - (let* ((buffer (process-buffer proc)) - (response (process-get proc :request-response)) + (let* ((response (process-get proc :request-response)) + ;; questionable whether (process-buffer proc) + ;; should override RESPONSE's -buffer member. + (buffer (or (process-buffer proc) + (request-response--buffer response))) (settings (request-response-settings response))) (request-log 'debug "request--curl-callback: event %s" event) (request-log 'trace "request--curl-callback: raw-bytes=\n%s" @@ -1170,22 +1175,24 @@ See info entries on sentinels regarding PROC and EVENT." (prog1 (apply #'request--curl url :semaphore (lambda (&rest _) (setq finished t)) settings) - (cl-loop with interval = 0.05 + (cl-loop with buf = (request-response--buffer response) + with interval = 0.05 with timeout = 5 with maxiter = (truncate (/ timeout interval)) with iter = 0 until (or (>= iter maxiter) finished) do (accept-process-output nil interval) - for buf = (request-response--buffer response) - for proc = (and (bufferp buf) (get-buffer-process buf)) + for proc = (get-buffer-process buf) if (or (not proc) (not (process-live-p proc))) + ;; only run the clock if lollygagging + ;; (before or after process lifetime) do (cl-incf iter) end finally (when (>= iter maxiter) (let ((m "request--curl-sync: semaphore never called")) - (princ (format "%s %s %s\n" + (princ (format "%s %S %s\n" m - (buffer-name buf) + buf (buffer-live-p buf)) #'external-debugging-output) (request-log 'error m)))))))