about summary refs log tree commit diff stats
path: root/forth
diff options
context:
space:
mode:
authorelioat <elioat@tilde.institute>2023-07-19 22:58:17 -0400
committerelioat <elioat@tilde.institute>2023-07-19 22:58:17 -0400
commitaaacfd6f4d6dd57098037de179f98d846b6ad5f3 (patch)
tree0284aa0218c853f3da67d0ad41ce8e4c73b016a8 /forth
parent313c7d81a673031813bfca84fa64eb3cbe7be24b (diff)
downloadtour-aaacfd6f4d6dd57098037de179f98d846b6ad5f3.tar.gz
*
Diffstat (limited to 'forth')
0 files changed, 0 insertions, 0 deletions
(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)
])