X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=t%2F79-uid-threads.t;fp=t%2F79-uid-threads.t;h=4818c0351c3eff2b666cf622b6f512f36313685f;hb=0f7334e9f0acbdac38c362be678bd6ecb658cb0b;hp=0000000000000000000000000000000000000000;hpb=c6e995c68b5384510061cde2d433e9506a3935f5;p=perl%2Fmodules%2FScope-Upper.git diff --git a/t/79-uid-threads.t b/t/79-uid-threads.t new file mode 100644 index 0000000..4818c03 --- /dev/null +++ b/t/79-uid-threads.t @@ -0,0 +1,78 @@ +#!perl -T + +use strict; +use warnings; + +sub skipall { + my ($msg) = @_; + require Test::More; + Test::More::plan(skip_all => $msg); +} + +use Config qw<%Config>; + +BEGIN { + my $force = $ENV{PERL_SCOPE_UPPER_TEST_THREADS} ? 1 : !1; + my $t_v = $force ? '0' : '1.67'; + skipall 'This perl wasn\'t built to support threads' + unless $Config{useithreads}; + skipall 'perl 5.13.4 required to test thread safety' + unless $force or "$]" >= 5.013004; + skipall "threads $t_v required to test thread safety" + unless eval "use threads $t_v; 1"; +} + +use Test::More; + +use Scope::Upper qw; + +my $num; + +BEGIN { + skipall 'This Scope::Upper isn\'t thread safe' unless SU_THREADSAFE; + plan tests => ($num = 30) * 5 + 1; + defined and diag "Using threads $_" for $threads::VERSION; + if (eval "use Time::HiRes; 1") { + defined and diag "Using Time::HiRes $_" for $Time::HiRes::VERSION; + *usleep = \&Time::HiRes::usleep; + } else { + diag 'Using fallback usleep'; + *usleep = sub { + my $s = int($_[0] / 2.5e5); + sleep $s if $s; + }; + } +} + +my $top = uid; + +sub cb { + my $tid = threads->tid(); + + my $here = uid; + my $up; + { + $up = uid HERE; + is uid(UP), $here, "uid(UP) == \$here in block (in thread $tid)"; + } + + is uid(UP), $top, "uid(UP) == \$top (in thread $tid)"; + + usleep rand(1e6); + + ok validate_uid($here), "\$here is valid (in thread $tid)"; + ok !validate_uid($up), "\$up is no longer valid (in thread $tid)"; + + return $here; +} + +my %uids; + +for my $thread (map threads->create(\&cb), 1 .. $num) { + my $tid = $thread->tid; + my $uid = $thread->join; + ++$uids{$uid}; + ok !validate_uid($uid), "\$here is no longer valid (out of thread $tid)"; +} + +is scalar(keys %uids), $num, 'all the UIDs were different';