[Top][All Lists]

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

Re: csi on Windows, Emacs and srfi 18

From: Kristian Lein-Mathisen
Subject: Re: csi on Windows, Emacs and srfi 18
Date: Sun, 5 Jul 2020 22:29:00 +0200

Hi George,

I think the problem may also be that your primordial thread is blocking all srfi-18 threads in it's (read) call. Possibly in addition to the missing output-flush calls.

I used to get around this in Chicken 4 by using the 'perley' egg, but it's not available for Chicken 5. You could simply (current-input-port (make-perley-port)) and have a non-srfi18-blocking stdin.

Maybe you could see if or could fix it?

Also, I found an old paste where I was having similar issues for subprocesses. You could see if there are some useful tricks in there: 

In particular, you could try the last snippet:
;; don't block while reading anything from port p. port p must have an
;; associated filedescriptor.
(define (make-nonblocking-input-port p)
  (make-input-port (lambda ()
                     (thread-wait-for-i/o! (port->fileno p))
                     (read-char p))
                   (lambda () (char-ready? p))
                   (lambda () (close-input-port p))))

And then add:

(current-input-port (make-nonblocking-input-port (current-input-port)))


On Sun, Jul 5, 2020, 21:34 George Oliver <> wrote:
Hello Kristian and thanks for looking into this.

On Sun, Jul 5, 2020 at 12:51 AM Kristian Lein-Mathisen
<> wrote:

> The sys##flush-output here is what you're looking for I think. It's problably not being called due to tty-input? returning #f. But it might work to redefine it to our needs:

I think this could possibly work but I couldn't get it working on my
system. Example session on my Emacs:


(c) 2008-2020, The CHICKEN Team
(c) 2000-2007, Felix L. Winkelmann
Version 5.2.0 (rev 317468e4)
mingw32-windows-gnu-x86-64 [ 64bit dload ptables ]

Type ,? for help.
#;1> ; loading C:/Users/george/AppData/Roaming/chicken/11/ ...
; loading C:/Users/george/AppData/Roaming/chicken/11/ ...
<------------   here I evaluated define foo from the example code in
my first email in the thread
#;3> ##sys#read-prompt-hook
#<procedure (##sys#read-prompt-hook)>
#;4> (set! ##sys#read-prompt-hook (lambda () (display "test> ") (flush-output)))
test> #<thread: thread24>                          <--------------
here I evaluated thread-start!
test> foo
test> foo
test> foo
test> ,q

Process scheme finished


Curiously this behavior is different than evaluating the test without
redefining the read-prompt-hook; in that first case repeated evals of
foo will iterate the loop in the thread-start!.

I got the same result running csi from the WIndows console.

I say it could possibly work because it seems like output buffering is
an issue here, for reference see

However I got farther with solution 2!

> ===== possible solution 2 =====
> It's possible that using a real socket might be a feasable workaround. `chicken-install nrepl` and start a session (outside of emacs) with
> > csi -R nrepl -e '(nrepl 1234)'

I actually had tried this earlier, but since Windows doesn't have the
nc utility it wasn't straightforward. I found the netcat Windows
utility but it took me a couple of tries to realize Windows was
disabling it (via Windows Security protection).

Example session:


;; nrepl on (C:\Users\george\bin\chicken-5.2.0\bin\csi.exe -R nrepl -e
(nrepl 1234))
#;>                            <----------  here I evaluate the
import, not sure why it doesn't print the output
#;>                            <---------- here I evaluate define foo
#;> #<thread: thread30>          <----------  evaluating thread-start!
#;> #<procedure (scheme#current-output-port . args)>
#<procedure (scheme#current-output-port . args)>
#<procedure (scheme#current-output-port . args)>
#<procedure (scheme#current-output-port . args)>
#<procedure (scheme#current-output-port . args)>
#<procedure (scheme#current-output-port . args)>
#<procedure (scheme#current-output-port . args)>
#<procedure (scheme#current-output-port . args)>
#<procedure (scheme#current-output-port . args)>
#<procedure (scheme#current-output-port . args)>
0                    <--------------- evaluating foo


So this seems like it could work!

One wrinkle is that csi toplevel commands don't seem to pass through
netcat correctly (for example ',q' returns 'Error: unbound variable:
unquote'). But that doesn't seem like a show stopper.

There is also a possibly more robust long-term solution that I just
learned about it. In recent Windows 10 updates MS released ConPTY,
which is a new pseudo tty API. See
Currently, when Emacs creates an asynchronous subprocess, it assumes
Windows has no PTY and defaults to using a pipe. It seems workable to
patch Emacs to use the new ConPTY. I'm going to see about getting this
into Emacs.

thanks again, George

reply via email to

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