[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