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
|
#!./perl
BEGIN {
chdir 't' if -d 't';
unshift @INC, '../lib';
require Config; import Config;
if (! $Config{'use5005threads'}) {
print "1..0 # Skip: not use5005threads\n";
exit 0;
}
# XXX known trouble with global destruction
$ENV{PERL_DESTRUCT_LEVEL} = 0 unless $ENV{PERL_DESTRUCT_LEVEL} > 3;
}
$| = 1;
print "1..21\n";
use Thread 'yield';
print "ok 1\n";
sub content
{
print shift;
return shift;
}
# create a thread passing args and immedaietly wait for it.
my $t = new Thread \&content,("ok 2\n","ok 3\n", 1..1000);
print $t->join;
# check that lock works ...
{lock $foo;
$t = new Thread sub { lock $foo; print "ok 5\n" };
print "ok 4\n";
}
$t->join;
sub dorecurse
{
my $val = shift;
my $ret;
print $val;
if (@_)
{
$ret = Thread->new(\&dorecurse, @_);
$ret->join;
}
}
$t = new Thread \&dorecurse, map { "ok $_\n" } 6..10;
$t->join;
# test that sleep lets other thread run
$t = new Thread \&dorecurse,"ok 11\n";
sleep 6;
print "ok 12\n";
$t->join;
sub islocked : locked {
my $val = shift;
my $ret;
print $val;
if (@_)
{
$ret = Thread->new(\&islocked, shift);
}
$ret;
}
$t = Thread->new(\&islocked, "ok 13\n", "ok 14\n");
$t->join->join;
{
package Loch::Ness;
sub new { bless [], shift }
sub monster : locked, method {
my($s, $m) = @_;
print "ok $m\n";
}
sub gollum { &monster }
}
Loch::Ness->monster(15);
Loch::Ness->new->monster(16);
Loch::Ness->gollum(17);
Loch::Ness->new->gollum(18);
my $short = "This is a long string that goes on and on.";
my $shorte = " a long string that goes on and on.";
my $long = "This is short.";
my $longe = " short.";
my $thr1 = new Thread \&threaded, $short, $shorte, "19";
my $thr2 = new Thread \&threaded, $long, $longe, "20";
sub threaded {
my ($string, $string_end, $testno) = @_;
# Do the match, saving the output in appropriate variables
$string =~ /(.*)(is)(.*)/;
# Yield control, allowing the other thread to fill in the match variables
yield();
# Examine the match variable contents; on broken perls this fails
if ($3 eq $string_end) {
print "ok $testno\n";
}
else {
warn <<EOT;
#
# This is a KNOWN FAILURE, and one of the reasons why threading
# is still an experimental feature. It is here to stop people
# from deploying threads in production. ;-)
#
EOT
print "not ok $testno # other thread filled in match variables\n";
}
}
$thr1->join;
$thr2->join;
print "ok 21\n";
|