X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDevel%2FGlobalDestruction.pm;h=418805d358f8f2af8c0c4edefa38dc6c1648feb4;hb=41ec1eaf0c685813f08d5c10727b8d39c46f4aa4;hp=dc7be3ff8a8765d06814d32c2f89ab78da460ea9;hpb=9d5ad1437b7ce54305830df01e1ce0d8bcbfed35;p=p5sagit%2FDevel-GlobalDestruction.git diff --git a/lib/Devel/GlobalDestruction.pm b/lib/Devel/GlobalDestruction.pm index dc7be3f..418805d 100644 --- a/lib/Devel/GlobalDestruction.pm +++ b/lib/Devel/GlobalDestruction.pm @@ -3,16 +3,20 @@ package Devel::GlobalDestruction; use strict; use warnings; -our $VERSION = '0.05'; +our $VERSION = '0.06'; use Sub::Exporter -setup => { exports => [ qw(in_global_destruction) ], groups => { default => [ -all ] }, }; +# we run 5.14+ - everything is in core +# if (defined ${^GLOBAL_PHASE}) { eval 'sub in_global_destruction () { ${^GLOBAL_PHASE} eq q[DESTRUCT] }'; } +# try to load the xs version if it was compiled +# elsif (eval { require XSLoader; XSLoader::load(__PACKAGE__, $VERSION); @@ -20,6 +24,8 @@ elsif (eval { }) { # the eval already installed everything, nothing to do } +# Not core nor XS +# else { # SpeedyCGI runs END blocks every cycle but somehow keeps object instances @@ -33,8 +39,14 @@ else { my ($in_global_destruction, $before_is_installed); -sub in_global_destruction { $in_global_destruction } +sub in_global_destruction () { $in_global_destruction } +# This block will fire towards the end of the program execution +# Since there is no way for us to generate an END which will execute *last* +# this is *NOT 100% INCOMPATIBLE* with XS/${^GLOBAL_PHASE}. We *may* end up +# with a true in_gloal_destruction() in the middle of another END block +# There are no practical cases where this matters. +# END { $in_global_destruction = 1; } @@ -45,7 +57,7 @@ END { # is claimed to run in the context of the new thread. However this does # not really seem to be the case - any END evaled in a CLONE is ignored :( # Hence blatantly hooking threads::create - +# if ($INC{'threads.pm'}) { my $orig_create = threads->can('create'); no warnings 'redefine';