Upgrade to threads 1.75
[p5sagit/p5-mst-13.2.git] / dist / threads / t / free.t
CommitLineData
385d56e4 1use strict;
2use warnings;
3
4BEGIN {
4271b527 5 # Import test.pl into its own package
6 {
7 package Test;
2adbc9b6 8 require($ENV{PERL_CORE} ? '../../t/test.pl' : './t/test.pl');
4271b527 9 }
10
385d56e4 11 use Config;
12 if (! $Config{'useithreads'}) {
4271b527 13 Test::skip_all(q/Perl not compiled with 'useithreads'/);
385d56e4 14 }
15}
16
17use ExtUtils::testlib;
18
9feacc09 19use threads;
9feacc09 20
21BEGIN {
e301958b 22 if (! eval 'use threads::shared; 1') {
4271b527 23 Test::skip_all(q/threads::shared not available/);
58a3a76c 24 }
25
18b9e6f5 26 require Thread::Queue;
27
9feacc09 28 $| = 1;
29 print("1..29\n"); ### Number of tests that will be run ###
4dcb9e53 30}
9feacc09 31
4271b527 32Test::watchdog(120); # In case we get stuck
9feacc09 33
18b9e6f5 34my $q = Thread::Queue->new();
35my $TEST = 1;
9feacc09 36
18b9e6f5 37sub ok
38{
39 $q->enqueue(@_);
40
41 while ($q->pending()) {
42 my $ok = $q->dequeue();
43 my $name = $q->dequeue();
44 my $id = $TEST++;
45
46 if ($ok) {
47 print("ok $id - $name\n");
48 } else {
49 print("not ok $id - $name\n");
50 printf("# Failed test at line %d\n", (caller)[2]);
51 }
385d56e4 52 }
385d56e4 53}
54
385d56e4 55
56### Start of Testing ###
18b9e6f5 57ok(1, 'Loaded');
385d56e4 58
59# Tests freeing the Perl interperter for each thread
60# See http://www.nntp.perl.org/group/perl.perl5.porters/110772 for details
61
f782ee33 62my ($COUNT, $STARTED) :shared;
385d56e4 63
64sub threading_1 {
18b9e6f5 65 my $q = shift;
66
385d56e4 67 my $tid = threads->tid();
18b9e6f5 68 $q->enqueue($tid, "Thread $tid started");
385d56e4 69
d4315dd6 70 my $id;
f782ee33 71 {
72 lock($STARTED);
73 $STARTED++;
d4315dd6 74 $id = $STARTED;
f782ee33 75 }
76 if ($STARTED < 5) {
385d56e4 77 sleep(1);
18b9e6f5 78 threads->create('threading_1', $q)->detach();
385d56e4 79 }
80
d4315dd6 81 if ($id == 1) {
385d56e4 82 sleep(2);
d4315dd6 83 } elsif ($id == 2) {
385d56e4 84 sleep(6);
d4315dd6 85 } elsif ($id == 3) {
385d56e4 86 sleep(3);
d4315dd6 87 } elsif ($id == 4) {
385d56e4 88 sleep(1);
89 } else {
90 sleep(2);
91 }
92
93 lock($COUNT);
94 $COUNT++;
95 cond_signal($COUNT);
18b9e6f5 96 $q->enqueue($tid, "Thread $tid done");
385d56e4 97}
98
99{
f782ee33 100 $STARTED = 0;
385d56e4 101 $COUNT = 0;
18b9e6f5 102 threads->create('threading_1', $q)->detach();
385d56e4 103 {
d4315dd6 104 my $cnt = 0;
105 while ($cnt < 5) {
106 {
107 lock($COUNT);
108 cond_wait($COUNT) if ($COUNT < 5);
109 $cnt = $COUNT;
110 }
f782ee33 111 threads->create(sub {
112 threads->create(sub { })->join();
113 })->join();
385d56e4 114 }
115 }
385d56e4 116 sleep(1);
117}
9feacc09 118ok($COUNT == 5, "Done - $COUNT threads");
385d56e4 119
120
121sub threading_2 {
18b9e6f5 122 my $q = shift;
123
385d56e4 124 my $tid = threads->tid();
18b9e6f5 125 $q->enqueue($tid, "Thread $tid started");
385d56e4 126
f782ee33 127 {
128 lock($STARTED);
129 $STARTED++;
130 }
131 if ($STARTED < 5) {
18b9e6f5 132 threads->create('threading_2', $q)->detach();
385d56e4 133 }
385d56e4 134 threads->yield();
135
136 lock($COUNT);
137 $COUNT++;
138 cond_signal($COUNT);
139
18b9e6f5 140 $q->enqueue($tid, "Thread $tid done");
385d56e4 141}
142
143{
f782ee33 144 $STARTED = 0;
385d56e4 145 $COUNT = 0;
18b9e6f5 146 threads->create('threading_2', $q)->detach();
f782ee33 147 threads->create(sub {
148 threads->create(sub { })->join();
149 })->join();
385d56e4 150 {
151 lock($COUNT);
f782ee33 152 while ($COUNT < 5) {
385d56e4 153 cond_wait($COUNT);
154 }
155 }
385d56e4 156 sleep(1);
157}
9feacc09 158ok($COUNT == 5, "Done - $COUNT threads");
385d56e4 159
160
161{
162 threads->create(sub { })->join();
163}
9feacc09 164ok(1, 'Join');
385d56e4 165
166
167sub threading_3 {
18b9e6f5 168 my $q = shift;
169
385d56e4 170 my $tid = threads->tid();
18b9e6f5 171 $q->enqueue($tid, "Thread $tid started");
385d56e4 172
173 {
174 threads->create(sub {
18b9e6f5 175 my $q = shift;
176
385d56e4 177 my $tid = threads->tid();
18b9e6f5 178 $q->enqueue($tid, "Thread $tid started");
385d56e4 179
385d56e4 180 sleep(1);
181
182 lock($COUNT);
183 $COUNT++;
184 cond_signal($COUNT);
185
18b9e6f5 186 $q->enqueue($tid, "Thread $tid done");
187 }, $q)->detach();
385d56e4 188 }
189
190 lock($COUNT);
191 $COUNT++;
192 cond_signal($COUNT);
193
18b9e6f5 194 $q->enqueue($tid, "Thread $tid done");
385d56e4 195}
196
197{
198 $COUNT = 0;
199 threads->create(sub {
18b9e6f5 200 threads->create('threading_3', $q)->detach();
385d56e4 201 {
202 lock($COUNT);
203 while ($COUNT < 2) {
204 cond_wait($COUNT);
205 }
206 }
207 })->join();
385d56e4 208 sleep(1);
209}
9feacc09 210ok($COUNT == 2, "Done - $COUNT threads");
385d56e4 211
561ee912 212exit(0);
213
385d56e4 214# EOF