test that CLONE time isn't detected as global destruction
[p5sagit/Devel-GlobalDestruction.git] / t / 02_thread.t
index 0b51704..bcf4878 100644 (file)
@@ -14,22 +14,48 @@ BEGIN {
 }
 
 use threads;
-use warnings;
+use threads::shared;
+
+our $had_error :shared;
+END { $? = $had_error||0 }
+
 use strict;
+use warnings;
 
 BEGIN {
   if ($ENV{DEVEL_GLOBALDESTRUCTION_PP_TEST}) {
-    require DynaLoader;
+    no strict 'refs';
     no warnings 'redefine';
-    my $orig = \&DynaLoader::bootstrap;
-    *DynaLoader::bootstrap = sub {
-      die 'no XS' if $_[0] eq 'Devel::GlobalDestruction';
-      goto $orig;
-    };
+
+    for my $f (qw(DynaLoader::bootstrap XSLoader::load)) {
+      my ($mod) = $f =~ /^ (.+) \:\: [^:]+ $/x;
+      eval "require $mod" or die $@;
+
+      my $orig = \&$f;
+      *$f = sub {
+        die 'no XS' if ($_[0]||'') eq 'Devel::GlobalDestruction';
+        goto $orig;
+      };
+    }
   }
 }
 
-my $t = threads->create(sub { do 't/01_basic.t' });
-$t->join;
+# load it before spawning a thread, that's the whole point
+require Devel::GlobalDestruction;
+
+sub do_test {
+
+  # just die so we don't need to deal with testcount skew
+  unless ( ($_[0]||'') eq 'arg' ) {
+    $had_error++;
+    die "Argument passing failed!";
+  }
+
+  delete $INC{'t/01_basic.t'};
+  do 't/01_basic.t';
+
+  1;
+}
 
-exit 0;
+threads->create('do_test', 'arg')->join
+  or $had_error++;