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 | 1 | 700ns | 700ns | $VERSION = '0.02'; |
12 | ||||
13 | 1 | 300ns | 300ns | local $@; |
14 | ||||
15 | eval { | |||
16 | 1 | 6µs | 6µs | require XSLoader; |
17 | 1 | 233µs | 233µs | __PACKAGE__->XSLoader::load($VERSION); # spent 224µs making 1 call to XSLoader::load |
18 | 1 | 900ns | 900ns | 1; |
19 | 1 | 1µs | 1µs | } or do { |
20 | require DynaLoader; | |||
21 | push @ISA, 'DynaLoader'; | |||
22 | __PACKAGE__->bootstrap($VERSION); | |||
23 | }; | |||
24 | 1 | 52µs | 52µs | } |
25 | ||||
26 | 1 | 14µs | 14µs | 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 | 2 | 106µs | 53µ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 |