BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
require Config; import Config;
if (! $Config{'usethreads'}) {
- print "1..0\n";
+ print "1..0 # Skip: this perl is not threaded\n";
exit 0;
}
- $ENV{PERL_DESTRUCT_LEVEL} = 0; # XXX known trouble with global destruction
+
+ # XXX known trouble with global destruction
+ $ENV{PERL_DESTRUCT_LEVEL} = 0 unless $ENV{PERL_DESTRUCT_LEVEL} > 3;
}
$| = 1;
-print "1..12\n";
+print "1..18\n";
use Thread;
print "ok 1\n";
}
# create a thread passing args and immedaietly wait for it.
-my $t = new Thread \&content,("ok 2\n","ok 3\n");
+my $t = new Thread \&content,("ok 2\n","ok 3\n", 1..1000);
print $t->join;
# check that lock works ...
}
$t->join;
-sub islocked
+sub dorecurse
{
my $val = shift;
my $ret;
print $val;
if (@_)
{
- $ret = Thread->new(\&islocked, @_);
+ $ret = Thread->new(\&dorecurse, @_);
$ret->join;
}
}
-$t = new Thread \&islocked, map { "ok $_\n" } 6..10;
+$t = new Thread \&dorecurse, map { "ok $_\n" } 6..10;
$t->join;
# test that sleep lets other thread run
-$t = new Thread \&islocked,"ok 11\n";
+$t = new Thread \&dorecurse,"ok 11\n";
sleep 6;
print "ok 12\n";
$t->join;
+
+sub islocked
+{
+ use attrs '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 {
+ use attrs qw(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);