diff options
author | Kartik Agaram <vc@akkartik.com> | 2020-01-01 17:04:37 -0800 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2020-01-01 17:04:37 -0800 |
commit | 2a4088119cf41175457414dfa59bd4064b8f0562 (patch) | |
tree | 64fe184e399f9870ebd481a90eec34d51e5dff68 /archive/1.vm.arc/channel.mu | |
parent | 23fd294d85959c6b476bcdc35ed6ad508cc99b8f (diff) | |
download | mu-2a4088119cf41175457414dfa59bd4064b8f0562.tar.gz |
5852
Diffstat (limited to 'archive/1.vm.arc/channel.mu')
-rw-r--r-- | archive/1.vm.arc/channel.mu | 49 |
1 files changed, 0 insertions, 49 deletions
diff --git a/archive/1.vm.arc/channel.mu b/archive/1.vm.arc/channel.mu deleted file mode 100644 index 61151833..00000000 --- a/archive/1.vm.arc/channel.mu +++ /dev/null @@ -1,49 +0,0 @@ -(function producer [ - ; produce numbers 1 to 5 on a channel - (default-space:space-address <- new space:literal 30:literal) - (chan:channel-address <- next-input) - ; n = 0 - (n:integer <- copy 0:literal) - { begin - (done?:boolean <- less-than n:integer 5:literal) - (break-unless done?:boolean) - ; other threads might get between these prints - ($print (("produce: " literal))) - (print-integer nil:literal/terminal n:integer) - ($print (("\n" literal))) - ; 'box' n into a dynamically typed 'tagged value' because that's what - ; channels take - (n2:integer <- copy n:integer) - (n3:tagged-value-address <- init-tagged-value integer:literal n2:integer) - (chan:channel-address/deref <- write chan:channel-address n3:tagged-value-address/deref) - (n:integer <- add n:integer 1:literal) - (loop) - } -]) - -(function consumer [ - ; consume and print integers from a channel - (default-space:space-address <- new space:literal 30:literal) - (chan:channel-address <- next-input) - { begin - ; read a tagged value from the channel - (x:tagged-value chan:channel-address/deref <- read chan:channel-address) - ; unbox the tagged value into an integer - (n2:integer <- maybe-coerce x:tagged-value integer:literal) - ; other threads might get between these prints - ($print (("consume: " literal))) - (print-integer nil:literal/terminal n2:integer) - ($print (("\n" literal))) - (loop) - } -]) - -(function main [ - (default-space:space-address <- new space:literal 30:literal) - (chan:channel-address <- init-channel 3:literal) - ; create two background 'routines' that communicate by a channel - (routine1:integer <- fork consumer:fn nil:literal/globals nil:literal/limit chan:channel-address) - (routine2:integer <- fork producer:fn nil:literal/globals nil:literal/limit chan:channel-address) - (sleep until-routine-done:literal routine1:integer) - (sleep until-routine-done:literal routine2:integer) -]) |