]> git.vpit.fr Git - perl/modules/Thread-Cleanup.git/commitdiff
Test that the thread destructors are executed before global destruction
authorVincent Pit <vince@profvince.com>
Sat, 27 Sep 2014 23:39:39 +0000 (01:39 +0200)
committerVincent Pit <vince@profvince.com>
Sat, 27 Sep 2014 23:39:39 +0000 (01:39 +0200)
t/10-join.t

index ba86a97b31dd43d43012402f295de83ef4945163..a3be76159b774bd392d499623d3c3b9b58e47fee 100644 (file)
@@ -4,6 +4,7 @@ use strict;
 use warnings;
 
 use lib 't/lib';
+use VPIT::TestHelpers;
 use Thread::Cleanup::TestThreads;
 
 use Test::More 'no_plan';
@@ -11,6 +12,7 @@ use Test::More 'no_plan';
 use Thread::Cleanup;
 
 my %called : shared;
+my $destr  : shared;
 my %nums   : shared;
 
 our $x = -1;
@@ -27,8 +29,14 @@ Thread::Cleanup::register {
   lock %nums;
   $nums{$tid};
  };
-
  is $x, $num, "\$x in destructor of thread $tid";
+
+ my $gd = do {
+  lock $destr;
+  (defined $destr && $destr =~ /\[$tid\]/) ? 1 : undef;
+ };
+ is $gd, undef, "thread $tid destructor fires before global destruction";
+
  local $x = $tid;
 };
 
@@ -43,6 +51,14 @@ sub cb {
   $ran{$tid}++;
  }
 
+ my $immortal = VPIT::TestHelpers::Guard->new(sub {
+  # It seems we can't lock aggregates during global destruction, so we
+  # resort to using a string instead.
+  lock $destr;
+  $destr .= "[$tid]";
+ });
+ $immortal->{self} = $immortal;
+
  {
   lock %nums;
   $nums{$tid} = $y;