about summary refs log blame commit diff stats
path: root/channel.mu
blob: c56e8889118a2a18cb159b7e2a7dc355e3c12935 (plain) (tree)















































                                                                                                  
(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
])