File Coverage

blib/lib/Devel/DTrace/Provider/Builder.pm
Criterion Covered Total %
statement 61 67 91.0
branch 5 12 41.6
condition n/a
subroutine 18 20 90.0
pod 0 8 0.0
total 84 107 78.5


line stmt bran cond sub pod time code
1             package Devel::DTrace::Provider::Builder;
2 5     5   69568 use strict;
  5         12  
  5         245  
3 5     5   29 use warnings;
  5         90  
  5         177  
4              
5 5     5   5541 use Sub::Install qw/ install_sub /;
  5         30592  
  5         34  
6 5         135 use Sub::Exporter -setup => {
7             exports => [
8             qw/ as /,
9             probe => \&build_probe,
10             provider => \&build_provider,
11             import => \&build_import
12             ],
13             groups => {
14             default => [
15             qw/ as probe provider import /
16             ],
17             },
18             collectors => {
19             INIT => \&capture_caller
20             }
21 5     5   213565 };
  5         116636  
22              
23 5     5   12840 use Devel::DTrace::Provider;
  5         20  
  5         5619  
24              
25             {
26             my $caller;
27             my $providers;
28             my $coderef;
29             my $provider_name;
30              
31             sub capture_caller {
32 5     5 0 666 my (undef, $args) = @_;
33 5         18 $caller = $args->{into};
34             }
35              
36             sub as (&) {
37 6     6 0 161364 $coderef = shift;
38             }
39              
40             sub build_provider {
41             sub ($$) {
42 6     6   14 $provider_name = shift;
43 6         13 my $provider;
44 6 50       32 $provider = Devel::DTrace::Provider->new($provider_name, 'perl')
45             if Devel::DTrace::Provider::DTRACE_AVAILABLE();
46              
47 6         45 $providers->{$caller}->{$provider_name} = {
48             args => {},
49             provider => $provider
50             };
51              
52 6         25 $coderef->();
53              
54 6         14 for my $probe_name (keys %{$providers->{$caller}->{$provider_name}->{args}}) {
  6         31  
55 11         259 my $args = $providers->{$caller}->{$provider_name}->{args}->{$probe_name};
56 11 50       41 $provider->add_probe($probe_name, 'func', $args)
57             if Devel::DTrace::Provider::DTRACE_AVAILABLE();
58 11         35 export_probe_functions($caller, $provider, $provider_name, $probe_name);
59             }
60              
61             $provider->enable
62 6 50       298 if Devel::DTrace::Provider::DTRACE_AVAILABLE();
63             }
64 5     5 0 143 }
65              
66             sub build_probe {
67             sub ($;@) {
68 11     11   44 my $name = shift;
69 11         64 $providers->{$caller}->{$provider_name}->{args}->{$name} = \@_;
70             }
71 5     5 0 2053 }
72              
73             sub build_import {
74             sub {
75 2     2   23 my $package = caller(0);
76 2         5 for my $provider_name (keys %{$providers->{$caller}}) {
  2         9  
77 3         80 my $provider = $providers->{$caller}->{$provider_name}->{provider};
78 3         6 for my $probe_name (keys %{$providers->{$caller}->{$provider_name}->{args}}) {
  3         11  
79 6         153 export_probe_functions($package, $provider, $provider_name, $probe_name);
80             }
81             }
82             }
83 5     5 0 203 }
84             }
85              
86             sub export_probe_functions {
87 17     17 0 40 my ($package, $provider, $provider_name, $probe_name) = @_;
88              
89 17         38 my $probe = probe_function($provider, $probe_name);
90 17         47 my $isenabled = probe_enabled_function($provider, $probe_name);
91              
92 17         37 $provider_name =~ tr/-/_/;
93 17         32 $probe_name =~ tr/-/_/;
94              
95 17         40 my $enabled_name = $probe_name . '_enabled';
96 17         33 my $provider_probe_name = $provider_name . '_' .$probe_name;
97 17         35 my $provider_enabled_name = $provider_probe_name . '_enabled';
98              
99 17         1386 install_sub({
100             code => $probe,
101             into => $package,
102             as => $probe_name
103             });
104 17         1141 install_sub({
105             code => $isenabled,
106             into => $package,
107             as => $enabled_name
108             });
109 17         947 install_sub({
110             code => $probe,
111             into => $package,
112             as => $provider_probe_name
113             });
114 17         926 install_sub({
115             code => $isenabled,
116             into => $package,
117             as => $provider_enabled_name
118             });
119             }
120              
121             sub probe_function {
122 17     17 0 31 my ($provider, $probe_name) = @_;
123              
124 17 50       45 if (Devel::DTrace::Provider::DTRACE_AVAILABLE()) {
125 0         0 my $stub = $provider->probes->{$probe_name};
126 0 0   0   0 return sub (&) { shift->($stub) if $stub->is_enabled };
  0         0  
127             }
128             else {
129 17     9   87 return sub (&) { 1 };
  9         10844  
130             }
131             }
132              
133             sub probe_enabled_function {
134 17     17 0 28 my ($provider, $probe_name) = @_;
135              
136 17 50       46 if (Devel::DTrace::Provider::DTRACE_AVAILABLE()) {
137 0         0 my $stub = $provider->probes->{$probe_name};
138 0     0   0 return sub { $stub->is_enabled };
  0         0  
139             }
140             else {
141 17     12   71 return sub { 0 };
  12         59  
142             }
143             }
144              
145             1;
146              
147             __END__