diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2015-01-25 02:25:50 -0800 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2015-01-25 02:25:50 -0800 |
commit | 4ca73eb66a57f32085be56c64ce316b82084602f (patch) | |
tree | 16f05bef3ed535f24b6426a60d83398d0967f7ad /buffered-stdin.mu | |
parent | bee53b4b169feab631658b5450328a317779831a (diff) | |
download | mu-4ca73eb66a57f32085be56c64ce316b82084602f.tar.gz |
620 - fix broken examples and tests again
I just did this in 611; what's the point of all this if tests can't stay passing? I don't understand why buffered-stdin.mu needs to preempt itself. stdin and buffered-stdin somehow end up sharing a single circular buffer, that's probably causing a race condition.
Diffstat (limited to 'buffered-stdin.mu')
-rw-r--r-- | buffered-stdin.mu | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/buffered-stdin.mu b/buffered-stdin.mu index 7db3e291..a0e39154 100644 --- a/buffered-stdin.mu +++ b/buffered-stdin.mu @@ -1,4 +1,4 @@ -; reads lines, prints when you hit 'enter' +; reads lines, prints them back when you hit 'enter' ; dies if you wait a while, because so far we never free memory (function main [ (default-space:space-address <- new space:literal 30:literal) @@ -10,18 +10,20 @@ ; buffer stdin (buffered-stdin:channel-address <- init-channel 1:literal) (fork-helper buffer-stdin:fn nil:literal/globals nil:literal/limit stdin:channel-address buffered-stdin:channel-address) - ; now read characters from the buffer until a 'enter' is typed - (s:string-address <- new "? ") - (print-string nil:literal/terminal s:string-address) { begin - (x:tagged-value stdin:channel-address/deref <- read buffered-stdin:channel-address) - (c:character <- maybe-coerce x:tagged-value character:literal) -;? (print-primitive-to-host (("AAA " literal))) ;? 0 -;? (print-primitive-to-host c:character) ;? 0 -;? (print-primitive-to-host (("\n" literal))) ;? 0 - (done?:boolean <- equal c:character ((#\newline literal))) - (break-if done?:boolean) - (print-character nil:literal/terminal c:character) + ; now read characters from the buffer until 'enter' is typed + (s:string-address <- new "? ") + (print-string nil:literal/terminal s:string-address) + { begin + (x:tagged-value stdin:channel-address/deref <- read buffered-stdin:channel-address) + (c:character <- maybe-coerce x:tagged-value character:literal) +;? (print-primitive-to-host (("AAA " literal))) ;? 1 +;? (print-primitive-to-host c:character) ;? 1 +;? (print-primitive-to-host (("\n" literal))) ;? 1 + (print-character nil:literal/terminal c:character) + (line-done?:boolean <- equal c:character ((#\newline literal))) + (loop-unless line-done?:boolean) + } (loop) } ]) |