mirror of
https://github.com/vale981/emacs-jupyter
synced 2025-03-04 15:41:37 -05:00
jupyter-ioloop: Fix for subprocess stdin buffering issue
This commit is contained in:
parent
909cdf3dd7
commit
02a0b470d9
2 changed files with 31 additions and 3 deletions
|
@ -367,7 +367,7 @@ the local host, otherwise events are expected to be received on
|
|||
STDIN. This is useful on Windows systems which don't allow
|
||||
polling the STDIN file handle."
|
||||
(let ((stdin-form
|
||||
(if port `(let ((sock (zmq-socket ctx zmq-PULL)))
|
||||
(if port `(let ((sock (zmq-socket ctx zmq-PAIR)))
|
||||
(prog1 sock
|
||||
(zmq-connect sock (format "tcp://127.0.0.1:%s" ,port))))
|
||||
'0))
|
||||
|
@ -446,8 +446,20 @@ If BUFFER is non-nil it should be a buffer that will be used as
|
|||
the IOLOOP subprocess buffer, see `zmq-start-process'."
|
||||
(jupyter-ioloop-stop ioloop)
|
||||
(let (stdin port)
|
||||
(when (memq system-type '(windows-nt ms-dos cygwin))
|
||||
(setq stdin (zmq-socket (zmq-current-context) zmq-PUSH))
|
||||
;; NOTE: A socket is used to read input from the parent process to avoid
|
||||
;; the stdin buffering done when using `read-from-minibuffer' in the
|
||||
;; subprocess. When `noninteractive', `read-from-minibuffer' uses
|
||||
;; `getc_unlocked' internally and `getc_unlocked' reads from the stdin FILE
|
||||
;; object as opposed to reading directly from STDIN_FILENO. The problem is
|
||||
;; that FILE objects are buffered streams which means that every message
|
||||
;; the parent process sends does not necessarily correspond to a POLLIN
|
||||
;; event on STDIN_FILENO in the subprocess. Since we only call
|
||||
;; `read-from-minibuffer' when there is a POLLIN event on STDIN_FILENO
|
||||
;; there is the potential that a message is waiting to be handled in the
|
||||
;; buffer used by stdin which will only get handled if we send more
|
||||
;; messages to the subprocess thereby creating more POLLIN events.
|
||||
(when (or t (memq system-type '(windows-nt ms-dos cygwin)))
|
||||
(setq stdin (zmq-socket (zmq-current-context) zmq-PAIR))
|
||||
(setq port (zmq-bind-to-random-port stdin "tcp://127.0.0.1")))
|
||||
(let ((process (zmq-start-process
|
||||
(jupyter-ioloop--function ioloop (when stdin port))
|
||||
|
|
|
@ -1021,6 +1021,22 @@
|
|||
(let ((result (read (buffer-string))))
|
||||
(should (equal result `(stop-channel :shell))))))))
|
||||
|
||||
(ert-deftest jupyter-zmq-channel-ioloop-send-fast ()
|
||||
:tags '(ioloop queue)
|
||||
;; :expected-result :failed
|
||||
(jupyter-test-with-python-client client
|
||||
(let ((jupyter-current-client client))
|
||||
(jupyter-send-execute-request client :code "1 + 1")
|
||||
(jupyter-send-execute-request client :code "1 + 1")
|
||||
(jupyter-send-execute-request client :code "1 + 1")
|
||||
(let ((req (jupyter-send-execute-request client :code "1 + 1")))
|
||||
(should
|
||||
(equal
|
||||
(jupyter-message-data
|
||||
(jupyter-wait-until-received :execute-result req jupyter-long-timeout)
|
||||
:text/plain)
|
||||
"2"))))))
|
||||
|
||||
;;; Completion
|
||||
|
||||
(ert-deftest jupyter-completion-number-p ()
|
||||
|
|
Loading…
Add table
Reference in a new issue