[slime-devel] Re: [patch] closing connections with :fd-handler style
Stephen Compall
s11 at member.fsf.org
Wed Jan 18 03:28:04 UTC 2006
Sorry for not replying; I didn't get your reply by email, and only saw
it when browsing gmane to check for just such an instance.
Helmut Eller writes:
> It's not the DO loop, it's because I can't reproduce the behavior.
> When I do a M-x slime-disconnect, everything seems to get closed just
> fine. Not that I can explain why open-stream-p in
> process-available-input returns true in that case, but apparently it
> does.
>
> So, how to you actually produce the endless loop?
In SBCL 0.9.8, here's what happens:
(defmacro debug-output (form)
(let ((var (gensym)))
`(let ((,var ,form))
(format t "~S: ~S~%" ',form ,var)
,var)))
(defun swank::process-available-input (stream fn)
(loop while (and (debug-output (open-stream-p stream))
(debug-output (listen stream)))
do (funcall fn)))
Now, in the SLIME REPL, you eval something like T and get this in sbcl's
native terminal:
(OPEN-STREAM-P STREAM): T
(LISTEN STREAM): T
(OPEN-STREAM-P STREAM): T
(LISTEN STREAM): NIL
This is fine. serve-event wakes up, and there is indeed input
available, so LISTEN should answer T. Then it returns to
process-available-input, and there is no more input, so it answers NIL.
Something weird happens when I slime-disconnect in emacs, though:
(OPEN-STREAM-P STREAM): T
(LISTEN STREAM): T
;; Event history start:
...
That is, LISTEN answers T even though you are at EOF, which is after all
why serve-event woke up. I have no idea how that worked out.
Now, I turn to a similar definition in CLISP 2.37, with communication
style set to :FD-HANDLER [1]:
(defun swank::process-available-input (stream fn)
(loop while (and (debug-output (open-stream-p stream))
(debug-output (listen stream)))
do (funcall fn))
(sleep 10))
For ordinary evaluation:
(OPEN-STREAM-P STREAM): T
(LISTEN STREAM): T
(OPEN-STREAM-P STREAM): T
(LISTEN STREAM): NIL
For slime-disconnect:
(OPEN-STREAM-P STREAM): T
(LISTEN STREAM): NIL
Repeated every 10 seconds forever. This behavior seems more ANSI, by
http://www.xach.com/clhs?q=listen :
Returns true if there is a character immediately available from
input-stream; otherwise, returns false. On a non-interactive
input-stream, listen returns true except when at end of file[1]. If an
end of file is encountered, listen returns false.
[1] To actually test FD-HANDLER in CLISP, grab ASDF package
nocandy-util, and the attached patch to swank-clisp.lisp; see
http://nocandysw.com/util . The patch and fd-dispatch are not quite
ready for mass consumption; for example, the way fd-handlers are removed
just works enough to implement remove-fd-handlers as needed by Swank.
--
Stephen Compall
http://scompall.nocandysw.com/blog
-------------- next part --------------
A non-text attachment was scrubbed...
Name: clisp-fdd2.patch
Type: text/x-patch
Size: 1032 bytes
Desc: not available
URL: <https://mailman.common-lisp.net/pipermail/slime-devel/attachments/20060117/ea089ced/attachment.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part
URL: <https://mailman.common-lisp.net/pipermail/slime-devel/attachments/20060117/ea089ced/attachment.sig>
More information about the slime-devel
mailing list