diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2014-11-25 01:25:20 -0800 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2014-11-25 01:25:20 -0800 |
commit | f192d6556debd363d2893ca8aab72b147527f15a (patch) | |
tree | 0d81ea7439efa2cdb756c427c1abe825a7fe8fda /channel.mu | |
parent | 14b33e59a528b996f682110564182524d1503e91 (diff) | |
download | mu-f192d6556debd363d2893ca8aab72b147527f15a.tar.gz |
325 - example program using channels
Diffstat (limited to 'channel.mu')
-rw-r--r-- | channel.mu | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/channel.mu b/channel.mu new file mode 100644 index 00000000..c56e8889 --- /dev/null +++ b/channel.mu @@ -0,0 +1,48 @@ +(def producer [ + ; produce numbers 1 to 5 on a channel + ((default-scope scope-address) <- new (scope literal) (30 literal)) + ((chan channel-address) <- arg) + ; n = 0 + ((n integer) <- copy (0 literal)) + { begin + ((done? boolean) <- lt (n integer) (5 literal)) + (break-unless (done? boolean)) + ; other threads might get between these prints + (print-primitive ("produce: " literal)) + (print-primitive (n integer)) + (print-primitive ("\n" literal)) + ; 'box' n into a dynamically typed 'tagged value' because that's what + ; channels take + ((n2 integer-address) <- new (integer literal)) + ((n2 integer-address deref) <- copy (n integer)) + ((n3 tagged-value-address) <- new-tagged-value (integer-address literal) (n2 integer-address)) + ((chan channel-address deref) <- write (chan channel-address) (n3 tagged-value-address deref)) + ((n integer) <- add (n integer) (1 literal)) + (continue) + } +]) + +(def consumer [ + ; consume and print integers from a channel + ((default-scope scope-address) <- new (scope literal) (30 literal)) + ((chan channel-address) <- arg) + { 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-address) <- maybe-coerce (x tagged-value) (integer-address literal)) + ; other threads might get between these prints + (print-primitive ("consume: " literal)) + (print-primitive (n2 integer-address deref)) + (print-primitive ("\n" literal)) + (continue) + } +]) + +(def main [ + ((chan channel-address) <- new-channel (3 literal)) + ; create two background 'routines' that communicate by a channel + (fork (consumer fn) (chan channel-address)) + (fork (producer fn) (chan channel-address)) + (sleep (2000 literal)) ; wait for forked routines to effect the transfer +]) |