1#!./parrot
2# Copyright (C) 2012, Parrot Foundation.
3
4.sub main :main
5    .local pmc task, sayer, starter, number, interp, tasks, results
6    .local int i, num_results, results_rem
7    interp = getinterp
8    sayer = get_global 'sayer'
9init:
10    starter = new ['Integer']
11    i = 1
12    starter = 0
13    say "1..100"
14    tasks = new ['ResizablePMCArray']
15    results = new ['ResizablePMCArray']
16start:
17    number = new ['String']
18    number = i
19    task = new ['Task']
20    push task, results
21    push task, starter
22    setattribute task, 'code', sayer
23    setattribute task, 'data', number
24    print "ok "
25    say number
26    push tasks, task
27    schedule task
28    inc i
29    if i > 50000 goto run
30    goto start
31run:
32    starter = 1
33check_results:
34    pass
35    num_results = results
36    results_rem = num_results % 1000
37    if results_rem != 0 goto skip_say
38    say num_results
39skip_say:
40    if num_results >= 50000 goto end
41    goto check_results
42end:
43    goto init
44.end
45
46.sub sayer
47    .param pmc name
48    .local pmc interp, task, starter, results, result_sub, result_task
49    .local int i
50    interp = getinterp
51    task = interp.'current_task'()
52    starter    = pop task
53    results    = pop task
54    result_sub = get_global 'push_result'
55start:
56    if starter > 0 goto run
57    sleep 0.1
58    goto start
59run:
60    result_task = new ['Task']
61    setattribute result_task, 'code', result_sub
62    setattribute result_task, 'data', results
63    push result_task, name
64    interp.'schedule_proxied'(result_task, results)
65    #say name
66.end
67
68.sub push_result
69    .param pmc results
70    .local pmc interp, task, number
71    interp = getinterp
72    task = interp.'current_task'()
73    number = pop task
74    push results, number
75.end
76
77.sub passing_sayer
78    .param pmc name
79    .local pmc interp, task, starter
80    interp = getinterp
81    task = interp.'current_task'()
82    starter = pop task
83start:
84    if starter > 0 goto run
85    pass
86    goto start
87run:
88    say name
89.end
90
91.sub busy_waiting_sayer
92    .param pmc name
93    .local pmc interp, task, starter
94    .local int i
95    interp = getinterp
96    task = interp.'current_task'()
97    starter = pop task
98start:
99    if starter > 0 goto run
100    i = 0
101loop:
102    inc i
103    if i >= 10000 goto start
104    goto loop
105run:
106    say name
107.end
108
109.sub sleeping_sayer
110    .param pmc name
111start:
112    say name
113    sleep 0.1
114    goto start
115.end
116
117.sub busy_sayer
118    .param pmc name
119    .local pmc starter
120    .local int i
121start:
122    i = 0
123    say name
124loop:
125    inc i
126    if i >= 1000000 goto start
127    goto loop
128.end
129
130# Local Variables:
131#   mode: pir
132#   fill-column: 100
133# End:
134# vim: expandtab shiftwidth=4 ft=pir:
135