[gambit-list] I/O issues (longish)
Christian
christian at pflanze.mine.nu
Sun Jan 29 18:41:58 EST 2006
At 15:18 Uhr -0500 29.01.2006, Marc Feeley wrote:
>On 29-Jan-06, at 9:55 AM, Christian wrote:
>
>>Hello
>>
>>I'm trying to write a program which I can use as wrapper around gambit
>>in interactive sessions, especially in emacs, to provide more sensible
>>buffering for making output appear faster in emacs.
>
>It will take some time before I have a chance to digest your message
>fully. However, concerning "a more sensible buffering" of output, I
>have recently added control over buffering which should satisfy your
>needs. Have you overlooked this or is there a problem with this
>mechanism?
I've missed it - thanks, that's good.
>Specifically, you can select the buffering type for the terminal
>with runtime options:
>
> gsi -:tu unbuffered
> gsi -:tn newline buffered
> gsi -:tf fully buffered
I've noticed that the repl flushes output, so I can even use -:tf,
cool. That's probably enough most of the time.
Only one minor thing which I envisioned in my wrapper is missing:
flushing the output periodically (that would basically give the same
impression as unbuffered output, so even if some code outputs "what's
the value of x?: " and doesn't flush or so, it is seen by the user).
I've tried out starting a flushing thread, which works, but hitting
ctl-c in the repl then just stops the flushing thread, and,
strangely, doesn't print anything about the interruption until I
enter something other than only hitting return:
> (let ((out (current-output-port)))
(thread-start!
(make-thread
(letrec ((lp (lambda ()
(thread-sleep! 0.1)
(force-output out)
(lp)))) lp))))
#<thread #2>
> (thread-start! (make-thread (lambda ()
(let lp ()
(thread-sleep! 1)
(display ".")
(lp)))))
#<thread #3>
> .....<ctl-c><return>
<return>
<return>
<return>
5<return>
5
------------- REPL is now in #<thread #2> -------------
*** INTERRUPTED IN ##thread-sleep!
>
After hitting ctl-c, the dots stop being output; nothing happens
anymore. Hitting return just scrolls up the terminal output, nothing
happens. Entering 5 and hitting return gives a 5 as result and
finally, the "REPL is now in ..." output appears. Why does it not
show up immediately? Note that this even happens with -:tu.
Other question: can I protect a particular thread (#2 in this case)
from being interrupted? Something like SIG_IGN signal masks for each
thread. With this, I could hide the flushing thread from the user.
And yet another question: is it possible to list all threads which
are waiting in a REPL, and to change "REPL input focus" to an
arbitrary other one of them? Sorry for my many questions (if at one
point I understand enough of Gambit's internals, I might find out
myself or even code it, but that will take some time).
Christian.
More information about the Gambit-list
mailing list