* Madhu m3r5y1ivt9.fsf@moon.robolove.meer.net : Wrote on Wed, 03 Jun 2009 13:38:18 +0530:
| * Benjamin L. Russell 6q572514ruc9h0td4fv6391hbtvqkmpa8v@4ax.com : | Wrote on Mon, 01 Jun 2009 17:59:44 +0900: | | | I finally discovered a patch, posted by Samium Gromoff in the thread | | "PATCH Output redirection in the SIMPLE SERVE EVENTS case." (see | | http://article.gmane.org/gmane.lisp.slime.devel/8513), documenting | | this bug and patching it. | | | | However, it introduced a new bug: This time, the banner does not | | appear, and I get the following lines in my REPL at startup, | | instead: | | [snip] | | | Anybody know how to patch this patch? Apparently, this patch does | | not seem to have been applied in the CVS version of swank.lisp | | No, I do not know how to fix the patch, and do not see your | problem. But I'm appending a WIP patch on the lines of Samium's patch | which I've tested on Lispworks/Linux. 1. I've not tried it with CLISP | 2. This will not work on CMUCL.
FTR There were errors in the patch I posted here by mistake. But for the general idea in Samium Gramoff's patch to work, under CMUCL and CLISP, and under the swank-stream-model-de-jour, the behaviour of SWANK:MAKE-REPL-INPUT-STREAM needs to be change, along the lines of:
diff --git a/swank.lisp b/swank.lisp index 4df8020..391c573 100644 --- a/swank.lisp +++ b/swank.lisp @@ -1358,18 +1359,16 :socket-open :socket-closed) (if (open-stream-p stdin) :stdin-open :stdin-closed)) - (loop - - (let* ((socket (connection.socket-io connection)) - (inputs (list socket stdin)) - (ready (wait-for-input inputs))) - (cond ((eq ready :interrupt) - (check-slime-interrupts)) - ((member socket ready) - (handle-requests connection t)) - ((member stdin ready) - (return (read-non-blocking stdin))) - (t (assert (null ready))))))))) + (loop (let* ((socket (connection.socket-io connection)) + (ready (or (and (listen stdin) (list stdin)) + (wait-for-input (list socket))))) + (cond ((eq ready :interrupt) + (check-slime-interrupts)) + ((member socket ready) + (handle-requests connection t)) + ((member stdin ready) + (return (read-non-blocking stdin))) + (t (assert (null ready)))))))))
(defun read-non-blocking (stream) (with-output-to-string (str)