5 # Import test.pl into its own package
8 require($ENV{PERL_CORE} ? '../../t/test.pl' : './t/test.pl');
12 if (! $Config{'useithreads'}) {
13 Test::skip_all(q/Perl not compiled with 'useithreads'/);
17 use ExtUtils::testlib;
22 if (! eval 'use threads::shared; 1') {
23 Test::skip_all(q/threads::shared not available/);
26 require Thread::Queue;
29 print("1..29\n"); ### Number of tests that will be run ###
32 Test::watchdog(120); # In case we get stuck
34 my $q = Thread::Queue->new();
41 while ($q->pending()) {
42 my $ok = $q->dequeue();
43 my $name = $q->dequeue();
47 print("ok $id - $name\n");
49 print("not ok $id - $name\n");
50 printf("# Failed test at line %d\n", (caller)[2]);
56 ### Start of Testing ###
59 # Tests freeing the Perl interperter for each thread
60 # See http://www.nntp.perl.org/group/perl.perl5.porters/110772 for details
62 my ($COUNT, $STARTED) :shared;
67 my $tid = threads->tid();
68 $q->enqueue($tid, "Thread $tid started");
78 threads->create('threading_1', $q)->detach();
96 $q->enqueue($tid, "Thread $tid done");
102 threads->create('threading_1', $q)->detach();
108 cond_wait($COUNT) if ($COUNT < 5);
111 threads->create(sub {
112 threads->create(sub { })->join();
118 ok($COUNT == 5, "Done - $COUNT threads");
124 my $tid = threads->tid();
125 $q->enqueue($tid, "Thread $tid started");
132 threads->create('threading_2', $q)->detach();
140 $q->enqueue($tid, "Thread $tid done");
146 threads->create('threading_2', $q)->detach();
147 threads->create(sub {
148 threads->create(sub { })->join();
158 ok($COUNT == 5, "Done - $COUNT threads");
162 threads->create(sub { })->join();
170 my $tid = threads->tid();
171 $q->enqueue($tid, "Thread $tid started");
174 threads->create(sub {
177 my $tid = threads->tid();
178 $q->enqueue($tid, "Thread $tid started");
186 $q->enqueue($tid, "Thread $tid done");
194 $q->enqueue($tid, "Thread $tid done");
199 threads->create(sub {
200 threads->create('threading_3', $q)->detach();
210 ok($COUNT == 2, "Done - $COUNT threads");