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