blob: 8e03cdc2c5172990d46c05b529c6c8609b0a1fa7 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
(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-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 <- 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-primitive (("consume: " literal)))
(print-primitive n2:integer)
(print-primitive (("\n" literal)))
(loop)
}
])
(function main [
(chan:channel-address <- init-channel 3:literal)
; create two background 'routines' that communicate by a channel
(fork consumer:fn nil:literal/globals nil:literal/limit chan:channel-address)
(fork producer:fn nil:literal/globals nil:literal/limit chan:channel-address)
(sleep for-some-cycles:literal 2000:literal) ; wait for forked routines to effect the transfer
])
|