From: Vincent Pit Date: Tue, 14 Apr 2015 16:01:47 +0000 (-0300) Subject: Make the threads feature evaluate the thread safe var in another process X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2FVPIT-TestHelpers.git;a=commitdiff_plain;h=ab33575c14a06487f6779b29ab3919291ce0c219 Make the threads feature evaluate the thread safe var in another process POSIX is required. --- diff --git a/lib/VPIT/TestHelpers.pm b/lib/VPIT/TestHelpers.pm index 0f37b40..d2484c6 100644 --- a/lib/VPIT/TestHelpers.pm +++ b/lib/VPIT/TestHelpers.pm @@ -525,7 +525,7 @@ sub capture_perl_failed_msg { Import : use VPIT::TestHelpers threads => [ - $pkg, $is_threadsafe, $force_var + $pkg, $threadsafe_var, $force_var ]; where : @@ -534,11 +534,11 @@ where : =item - -C<$pkg> is the target package name to be used in error messages (defaults to C<'package'>) ; +C<$pkg> is the target package name that will be exercised by this test ; =item - -C<$is_threadsafe> is a boolean telling whether the target module is thread-safe (not tested if C) ; +C<$threadsafe_var> is the name of an optional variable in C<$pkg> that evaluates to true if and only if the module claims to be thread safe (not checked if either C<$threadsafe_var> or C<$pkg> is C) ; =item - @@ -558,6 +558,10 @@ C 5.13.4 =item - +L + +=item - + L 1.67 =item - @@ -587,13 +591,29 @@ C =cut sub init_threads { - my ($pkg, $threadsafe, $force_var) = @_; + my ($pkg, $threadsafe_var, $force_var) = @_; skip_all 'This perl wasn\'t built to support threads' unless $Config::Config{useithreads}; - $pkg = 'package' unless defined $pkg; - skip_all "This $pkg isn't thread safe" if defined $threadsafe and !$threadsafe; + if (defined $pkg and defined $threadsafe_var) { + my $threadsafe; + my $stat = run_perl("require POSIX; require $pkg; exit($threadsafe_var ? POSIX::EXIT_SUCCESS() : POSIX::EXIT_FAILURE())"); + if (defined $stat) { + require POSIX; + my $res = $stat >> 8; + if ($res == POSIX::EXIT_SUCCESS()) { + $threadsafe = 1; + } elsif ($res == POSIX::EXIT_FAILURE()) { + $threadsafe = !1; + } + } + if (not defined $threadsafe) { + skip_all "Could not detect if $pkg is thread safe or not"; + } elsif (not $threadsafe) { + skip_all "This $pkg is not thread safe"; + } + } $force_var = 'PERL_FORCE_TEST_THREADS' unless defined $force_var; my $force = $ENV{$force_var} ? 1 : !1; diff --git a/t/41-threads-unsafe.t b/t/41-threads-unsafe.t index 79c14ff..fc82854 100644 --- a/t/41-threads-unsafe.t +++ b/t/41-threads-unsafe.t @@ -1,4 +1,4 @@ -#!perl -T +#!perl use strict; use warnings; diff --git a/t/43-threads-unsafe-forced.t b/t/43-threads-unsafe-forced.t index ae05c60..48637f4 100644 --- a/t/43-threads-unsafe-forced.t +++ b/t/43-threads-unsafe-forced.t @@ -1,4 +1,4 @@ -#!perl -T +#!perl use strict; use warnings;