| File | /usr/local/lib/perl/5.10.0/Devel/GlobalDestruction.pm |
| Statements Executed | 20 |
| Total Time | 0.0005758 seconds |
| Line | Stmts. | Exclusive Time | Avg. | Code |
|---|---|---|---|---|
| 1 | #!/usr/bin/perl | |||
| 2 | ||||
| 3 | package Devel::GlobalDestruction; | |||
| 4 | ||||
| 5 | 3 | 31µs | 10µs | use strict; # spent 10µs making 1 call to strict::import |
| 6 | 3 | 29µs | 10µs | use warnings; # spent 20µs making 1 call to warnings::import |
| 7 | ||||
| 8 | 3 | 97µs | 32µs | use vars qw($VERSION @ISA); # spent 40µs making 1 call to vars::import |
| 9 | ||||
| 10 | BEGIN { | |||
| 11 | 3 | 2µs | 800ns | $VERSION = '0.02'; |
| 12 | ||||
| 13 | local $@; | |||
| 14 | ||||
| 15 | eval { | |||
| 16 | require XSLoader; | |||
| 17 | __PACKAGE__->XSLoader::load($VERSION); # spent 224µs making 1 call to XSLoader::load | |||
| 18 | 1; | |||
| 19 | 3 | 240µs | 80µs | } or do { |
| 20 | require DynaLoader; | |||
| 21 | push @ISA, 'DynaLoader'; | |||
| 22 | __PACKAGE__->bootstrap($VERSION); | |||
| 23 | }; | |||
| 24 | 1 | 52µs | 52µs | } |
| 25 | ||||
| 26 | use Sub::Exporter -setup => { # spent 544µs making 1 call to Sub::Exporter::__ANON__[/usr/local/share/perl/5.10.0/Sub/Exporter.pm:756] | |||
| 27 | exports => [ qw(in_global_destruction) ], | |||
| 28 | groups => { default => [ -all ] }, | |||
| 29 | 3 | 120µs | 40µs | }; |
| 30 | ||||
| 31 | 1 | 6µs | 6µs | __PACKAGE__ |
| 32 | ||||
| 33 | __END__ | |||
| 34 | ||||
| 35 | =pod | |||
| 36 | ||||
| 37 | =head1 NAME | |||
| 38 | ||||
| 39 | Devel::GlobalDestruction - Expose PL_dirty, the flag which marks global | |||
| 40 | destruction. | |||
| 41 | ||||
| 42 | =head1 SYNOPSIS | |||
| 43 | ||||
| 44 | package Foo; | |||
| 45 | use Devel::GlobalDestruction; | |||
| 46 | ||||
| 47 | use namespace::clean; # to avoid having an "in_global_destruction" method | |||
| 48 | ||||
| 49 | sub DESTROY { | |||
| 50 | return if in_global_destruction; | |||
| 51 | ||||
| 52 | do_something_a_little_tricky(); | |||
| 53 | } | |||
| 54 | ||||
| 55 | =head1 DESCRIPTION | |||
| 56 | ||||
| 57 | Perl's global destruction is a little tricky to deal with WRT finalizers | |||
| 58 | because it's not ordered and objects can sometimes disappear. | |||
| 59 | ||||
| 60 | Writing defensive destructors is hard and annoying, and usually if global | |||
| 61 | destruction is happenning you only need the destructors that free up non | |||
| 62 | process local resources to actually execute. | |||
| 63 | ||||
| 64 | For these constructors you can avoid the mess by simply bailing out if global | |||
| 65 | destruction is in effect. | |||
| 66 | ||||
| 67 | =head1 EXPORTS | |||
| 68 | ||||
| 69 | This module uses L<Sub::Exporter> so the exports may be renamed, aliased, etc. | |||
| 70 | ||||
| 71 | =over 4 | |||
| 72 | ||||
| 73 | =item in_global_destruction | |||
| 74 | ||||
| 75 | Returns the current value of C<PL_dirty>. | |||
| 76 | ||||
| 77 | =back | |||
| 78 | ||||
| 79 | =head1 VERSION CONTROL | |||
| 80 | ||||
| 81 | This module is maintained using Darcs. You can get the latest version from | |||
| 82 | L<http://nothingmuch.woobling.org/code>, and use C<darcs send> to commit | |||
| 83 | changes. | |||
| 84 | ||||
| 85 | =head1 AUTHOR | |||
| 86 | ||||
| 87 | Yuval Kogman E<lt>nothingmuch@woobling.orgE<gt> | |||
| 88 | ||||
| 89 | =head1 COPYRIGHT | |||
| 90 | ||||
| 91 | Copyright (c) 2008 Yuval Kogman. All rights reserved | |||
| 92 | This program is free software; you can redistribute | |||
| 93 | it and/or modify it under the same terms as Perl itself. | |||
| 94 | ||||
| 95 | =cut | |||
| 96 | ||||
| 97 |