about summary refs log tree commit diff stats
path: root/buffered-stdin.mu
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2015-01-25 02:25:50 -0800
committerKartik K. Agaram <vc@akkartik.com>2015-01-25 02:25:50 -0800
commit4ca73eb66a57f32085be56c64ce316b82084602f (patch)
tree16f05bef3ed535f24b6426a60d83398d0967f7ad /buffered-stdin.mu
parentbee53b4b169feab631658b5450328a317779831a (diff)
downloadmu-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.mu26
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)
   }
 ])