]> git.vpit.fr Git - perl/modules/Linux-SysInfo.git/commitdiff
Skip threads tests unless perl version is 5.13.4 or greater
authorVincent Pit <vince@profvince.com>
Sun, 1 Sep 2013 14:39:29 +0000 (16:39 +0200)
committerVincent Pit <vince@profvince.com>
Sun, 1 Sep 2013 14:39:29 +0000 (16:39 +0200)
There was a long standing bug in the handling of GV <-> CV double linkage
that could (and explicitely did with a poisonous perl) cause segfaults at
thread destruction. It got fixed by Dave in commit 803f274 which went in
5.13.3, but the fix was amended for 5.13.4 in commit 09aad8f. Since it's
not really fair for the user to not be able to install the module because
of this, we skip the threads tests unless perl is at least 5.13.4.

MANIFEST
t/30-threads.t
t/lib/Linux/SysInfo/TestThreads.pm [new file with mode: 0644]

index a23850c3af90bc26cf95c9b4b7360ed24f01012b..ff91fcd6746da55242de89a4ef097a294603858b 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -11,3 +11,5 @@ t/01-import.t
 t/10-standard.t
 t/20-extended.t
 t/30-threads.t
+t/lib/Linux/SysInfo/TestThreads.pm
+t/lib/VPIT/TestHelpers.pm
index 690bd1167658ba44bab73296acbbeb628ef1a0f4..cd4c3a617861242968c7e82bce6866e93c81720f 100644 (file)
@@ -3,22 +3,10 @@
 use strict;
 use warnings;
 
-use Config qw<%Config>;
-
-BEGIN {
- my $has_threads = do {
-  local $@;
-  $Config{useithreads} and eval "use threads; 1";
- };
- # Load Test::More after threads
- require Test::More;
- Test::More->import;
- if ($has_threads) {
-  plan(tests => 4 * 10);
- } else {
-  plan(skip_all => 'This perl wasn\'t built to support threads');
- }
-}
+use lib 't/lib';
+use Linux::SysInfo::TestThreads;
+
+use Test::More 'no_plan';
 
 use Linux::SysInfo qw<sysinfo>;
 
@@ -40,5 +28,8 @@ sub try {
  }
 }
 
-my @t = map { threads->create(\&try, $_) } 1 .. 10;
-$_->join for @t;
+my @threads = map spawn(\&try, $_), 1 .. 10;
+
+$_->join for @threads;
+
+pass 'done';
diff --git a/t/lib/Linux/SysInfo/TestThreads.pm b/t/lib/Linux/SysInfo/TestThreads.pm
new file mode 100644 (file)
index 0000000..37a88c9
--- /dev/null
@@ -0,0 +1,49 @@
+package Linux::SysInfo::TestThreads;
+
+use strict;
+use warnings;
+
+use Config qw<%Config>;
+
+use VPIT::TestHelpers;
+
+sub diag {
+ require Test::More;
+ Test::More::diag($_) for @_;
+}
+
+sub import {
+ shift;
+
+ my $force = $ENV{PERL_LINUX_SYSINFO_TEST_THREADS} ? 1 : !1;
+ skip_all 'This perl wasn\'t built to support threads'
+                                                    unless $Config{useithreads};
+ skip_all 'perl 5.13.4 required to test thread safety'
+                                             unless $force or "$]" >= 5.013_004;
+
+ load_or_skip_all('threads', $force ? '0' : '1.67', [ ]);
+
+ my %exports = (
+  spawn => \&spawn,
+ );
+
+ my $pkg = caller;
+ while (my ($name, $code) = each %exports) {
+  no strict 'refs';
+  *{$pkg.'::'.$name} = $code;
+ }
+}
+
+sub spawn {
+ local $@;
+ my @diag;
+ my $thread = eval {
+  local $SIG{__WARN__} = sub { push @diag, "Thread creation warning: @_" };
+  threads->create(@_);
+ };
+ push @diag, "Thread creation error: $@" if $@;
+ diag(@diag) if @diag;
+ return $thread ? $thread : ();
+}
+
+1;