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