[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#44642: 27.1; read-string does not signal on EOF after calling server

From: Chris Hunt
Subject: bug#44642: 27.1; read-string does not signal on EOF after calling server-eval-at
Date: Sat, 14 Nov 2020 15:40:31 -0500

> In that case, I see no bug here.   read_minibuf_noninteractive calls
> 'getchar'; if that is interrupted by a signal, we retry the call; thus
> the infinite loop.  In your case, I'm guessing that the signal is
> SIGPIPE, because the input of the Emacs process is from a pipe, and
> the other side of the pipe exited.

Thanks, that seems like a reasonable guess. I don't know how to
confirm the specific signal causing the EINTR.

If not a bug, I think there is at least some room for improvement. The
stated behavior of
`read-string' (via `read-from-minibuffer') is:

  If default is nil, empty input results in an end-of-file error.

I was relying on this for an input loop of the form.

#+begin_src emacs-lisp
(while (setq command (ignore-errors (read-string "")))
  (setq command (read command))
  (message "[DEBUG] Received command %s" command)
  (let ((result (eval command)))
    (message "[DEBUG] Response received %s" result)))

Which works fine until using `(server-eval-at (getenv
"RPC_SERVER_NAME") command)` in place
of `(eval command)` - that's when the unexpected behavior is observed.
Something in the docs for `read-string', `--batch', `server-eval-at',
or the list of known issues
could be a start - "if using `server-eval-at' in `--batch' mode, take care not
to possibly read to the end of input"

> If my analysis is correct, then your script setup needs to be modified
> to not trigger this condition.

For my use case I think I can work around this using a sentinel value,
killing the process explicitly from the parent, or switching to an
approach using jsonrpc.el.

reply via email to

[Prev in Thread] Current Thread [Next in Thread]