-
Notifications
You must be signed in to change notification settings - Fork 138
/
task.t
148 lines (117 loc) · 2.4 KB
/
task.t
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#!./parrot
# Copyright (C) 2010-2013, Parrot Foundation.
.include 'sysinfo.pasm'
.loadlib 'sys_ops'
.sub main
# TODO not yet thread-safe (schedule counter updates)
# Use say instead inside tasks
.include 'test_more.pir'
plan(8)
ok(1, "initialized")
tasks_run()
task_send_recv()
print "ok 7 #SKIP task.kill - no reliable test yet [GH #907]\n"
goto post_kill
$S0 = sysinfo .SYSINFO_PARROT_OS
if $S0 == 'MSWin32' goto skip_kill
if $S0 == 'cygwin' goto skip_kill
task_kill()
goto post_kill
skip_kill:
print "ok 7 #SKIP task.kill - no signals on Windows yet\n"
post_kill:
preempt_and_exit()
.end
.sub tasks_run
$P0 = new 'Integer', 0
set_global 'N', $P0
$P0 = get_global 'task1'
$P1 = new 'Task', $P0
schedule $P1
wait $P1
$P0 = get_global 'task2'
$P1 = new 'Task', $P0
schedule $P1
wait $P1
$P0 = get_global 'sub1'
schedule $P0
.end
.sub task1
say "ok 2 task1 ran"
.end
.sub task2
say "ok 3 task2 ran"
.end
.sub sub1
say "ok 4 sub1 ran"
.end
.sub task_send_recv
$P0 = get_global 'recv_msg1'
$P1 = new 'Task', $P0
schedule $P1
sleep 0.1
$P2 = new 'String'
$P2 = "Hai 1"
$P1.'send'($P2)
wait $P1
$P0 = get_global 'recv_msg2'
$P1 = new 'Task', $P0
$P2 = new 'String'
$P2 = "Hai 2"
$P1.'send'($P2)
schedule $P1
wait $P1
.end
.sub recv_msg1
$P0 = receive
$P1 = new 'String'
$P1 = "Hai 1"
if $P0 == $P1 goto ok
returncc
ok:
say "ok 5 Got message after block"
.end
.sub recv_msg2
$P0 = receive
$P1 = new 'String'
$P1 = "Hai 2"
if $P0 == $P1 goto ok
returncc
ok:
say "ok 6 Got existing message"
.end
.sub task_kill
.local pmc task, code
code = get_global 'task_to_kill'
task = new 'Task', code
schedule task
pass
task.'kill'()
wait task
# busy wait for signal to arrive at the other thread
$I0 = 0
loop:
$I0 = $I0 + 1
if $I0 < 5000 goto loop
.end
.sub task_to_kill
print "ok 7 task_to_kill running\n"
sleep 0.2
say "not ok 8 task_to_kill wasn't killed"
.end
.sub preempt_and_exit
$P0 = get_global 'exit0'
$P1 = new 'Task', $P0
schedule $P1
again:
goto again
.end
.sub exit0
say "ok 8 pre-empt and exit"
exit 0
.end
# Local Variables:
# mode: pir
# fill-column: 100
# End:
# vim: expandtab shiftwidth=4 ft=pir: