← Index
NYTProf Performance Profile   « line view »
For /usr/sbin/pkg_info
  Run on Fri Aug 4 10:15:59 2017
Reported on Fri Aug 4 10:16:18 2017

Filename/usr/libdata/perl5/OpenBSD/PackageLocation.pm
StatementsExecuted 32 statements in 1.86ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
111761µs1.56msOpenBSD::PackageLocation::::BEGIN@24 OpenBSD::PackageLocation::BEGIN@24
31132µs60µsOpenBSD::PackageLocation::::new OpenBSD::PackageLocation::new
11120µs24µsOpenBSD::PackageRepository::::BEGIN@18 OpenBSD::PackageRepository::BEGIN@18
31116µs16µsOpenBSD::PackageLocation::::name OpenBSD::PackageLocation::name
11111µs76µsOpenBSD::PackageLocation::::BEGIN@25 OpenBSD::PackageLocation::BEGIN@25
11110µs18µsOpenBSD::PackageRepository::::BEGIN@19 OpenBSD::PackageRepository::BEGIN@19
11110µs150µsOpenBSD::PackageLocation::::BEGIN@23 OpenBSD::PackageLocation::BEGIN@23
0000s0sOpenBSD::PackageLocation::Installed::::infoOpenBSD::PackageLocation::Installed::info
0000s0sOpenBSD::PackageLocation::Installed::::plistOpenBSD::PackageLocation::Installed::plist
0000s0sOpenBSD::PackageLocation::::__ANON__[:54] OpenBSD::PackageLocation::__ANON__[:54]
0000s0sOpenBSD::PackageLocation::::__ANON__[:67] OpenBSD::PackageLocation::__ANON__[:67]
0000s0sOpenBSD::PackageLocation::::__ANON__[:68] OpenBSD::PackageLocation::__ANON__[:68]
0000s0sOpenBSD::PackageLocation::::_opened OpenBSD::PackageLocation::_opened
0000s0sOpenBSD::PackageLocation::::_set_callback OpenBSD::PackageLocation::_set_callback
0000s0sOpenBSD::PackageLocation::::close OpenBSD::PackageLocation::close
0000s0sOpenBSD::PackageLocation::::close_after_error OpenBSD::PackageLocation::close_after_error
0000s0sOpenBSD::PackageLocation::::close_now OpenBSD::PackageLocation::close_now
0000s0sOpenBSD::PackageLocation::::close_with_client_error OpenBSD::PackageLocation::close_with_client_error
0000s0sOpenBSD::PackageLocation::::contents OpenBSD::PackageLocation::contents
0000s0sOpenBSD::PackageLocation::::deref OpenBSD::PackageLocation::deref
0000s0sOpenBSD::PackageLocation::::find_contents OpenBSD::PackageLocation::find_contents
0000s0sOpenBSD::PackageLocation::::finish_and_close OpenBSD::PackageLocation::finish_and_close
0000s0sOpenBSD::PackageLocation::::forget OpenBSD::PackageLocation::forget
0000s0sOpenBSD::PackageLocation::::getNext OpenBSD::PackageLocation::getNext
0000s0sOpenBSD::PackageLocation::::grabPlist OpenBSD::PackageLocation::grabPlist
0000s0sOpenBSD::PackageLocation::::grab_info OpenBSD::PackageLocation::grab_info
0000s0sOpenBSD::PackageLocation::::info OpenBSD::PackageLocation::info
0000s0sOpenBSD::PackageLocation::::next OpenBSD::PackageLocation::next
0000s0sOpenBSD::PackageLocation::::plist OpenBSD::PackageLocation::plist
0000s0sOpenBSD::PackageLocation::::set_callback OpenBSD::PackageLocation::set_callback
0000s0sOpenBSD::PackageLocation::::skip OpenBSD::PackageLocation::skip
0000s0sOpenBSD::PackageLocation::::unput OpenBSD::PackageLocation::unput
0000s0sOpenBSD::PackageLocation::::url OpenBSD::PackageLocation::url
0000s0sOpenBSD::PackageLocation::::wipe_info OpenBSD::PackageLocation::wipe_info
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1# ex:ts=8 sw=4:
2# $OpenBSD: PackageLocation.pm,v 1.51 2017/03/07 14:15:09 espie Exp $
3#
4# Copyright (c) 2003-2007 Marc Espie <espie@openbsd.org>
5#
6# Permission to use, copy, modify, and distribute this software for any
7# purpose with or without fee is hereby granted, provided that the above
8# copyright notice and this permission notice appear in all copies.
9#
10# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
18228µs228µs
# spent 24µs (20+4) within OpenBSD::PackageRepository::BEGIN@18 which was called: # once (20µs+4µs) by OpenBSD::PackageRepository::BEGIN@30 at line 18
use strict;
# spent 24µs making 1 call to OpenBSD::PackageRepository::BEGIN@18 # spent 4µs making 1 call to strict::import
19230µs226µs
# spent 18µs (10+8) within OpenBSD::PackageRepository::BEGIN@19 which was called: # once (10µs+8µs) by OpenBSD::PackageRepository::BEGIN@30 at line 19
use warnings;
# spent 18µs making 1 call to OpenBSD::PackageRepository::BEGIN@19 # spent 8µs making 1 call to warnings::import
20
21package OpenBSD::PackageLocation;
22
23228µs2290µs
# spent 150µs (10+140) within OpenBSD::PackageLocation::BEGIN@23 which was called: # once (10µs+140µs) by OpenBSD::PackageRepository::BEGIN@30 at line 23
use OpenBSD::PackageInfo;
# spent 150µs making 1 call to OpenBSD::PackageLocation::BEGIN@23 # spent 140µs making 1 call to Exporter::import
242142µs11.56ms
# spent 1.56ms (761µs+804µs) within OpenBSD::PackageLocation::BEGIN@24 which was called: # once (761µs+804µs) by OpenBSD::PackageRepository::BEGIN@30 at line 24
use OpenBSD::Temp;
# spent 1.56ms making 1 call to OpenBSD::PackageLocation::BEGIN@24
2521.55ms2142µs
# spent 76µs (11+65) within OpenBSD::PackageLocation::BEGIN@25 which was called: # once (11µs+65µs) by OpenBSD::PackageRepository::BEGIN@30 at line 25
use OpenBSD::Error;
# spent 76µs making 1 call to OpenBSD::PackageLocation::BEGIN@25 # spent 65µs making 1 call to Exporter::import
26
27sub new
28
# spent 60µs (32+28) within OpenBSD::PackageLocation::new which was called 3 times, avg 20µs/call: # 3 times (32µs+28µs) by OpenBSD::PackageRepositoryBase::new_location at line 163 of OpenBSD/PackageRepository/Installed.pm, avg 20µs/call
{
2933µs my ($class, $repository, $name) = @_;
30
31314µs328µs my $self = { repository => $repository, name => $repository->canonicalize($name) };
# spent 28µs making 3 calls to OpenBSD::PackageRepositoryBase::canonicalize, avg 9µs/call
3233µs bless $self, $class;
33315µs return $self;
34
35}
36
37sub url
38{
39 my $self = shift;
40
41 return $self->{repository}->url($self->name);
42}
43
44sub name
45
# spent 16µs within OpenBSD::PackageLocation::name which was called 3 times, avg 5µs/call: # 3 times (16µs+0s) by OpenBSD::PkgInfo::parse_and_run at line 603 of OpenBSD/PkgInfo.pm, avg 5µs/call
{
4632µs my $self = shift;
47315µs return $self->{name};
48}
49
50OpenBSD::Auto::cache(pkgname,
51 sub {
52 my $self = shift;
53 return OpenBSD::PackageName->from_string($self->name);
5416µs113µs });
# spent 13µs making 1 call to OpenBSD::Auto::cache
55
56OpenBSD::Auto::cache(update_info,
57 sub {
58 my $self = shift;
59 if ($self->name =~ /^quirks\-/) {
60 return $self->plist;
61 }
62 return $self->plist(\&OpenBSD::PackingList::UpdateInfoOnly,
63 sub {
64 return 0 if $_[0] =~ m/^\@option\s+always-update\b/m;
65 return 1 if $_[0] =~ m/^\@(?:newgroup|newuser|cwd)\b/m;
66 return 0;
67 });
6814µs18µs });
# spent 8µs making 1 call to OpenBSD::Auto::cache
69
70
71# make sure self is opened and move to the right location if need be.
72sub _opened
73{
74 my $self = shift;
75
76 if (defined $self->{fh}) {
77 return $self;
78 }
79 my $fh = $self->{repository}->open($self);
80 if (!defined $fh) {
81 $self->{repository}->parse_problems($self->{errors}, undef,
82 $self) if defined $self->{errors};
83 undef $self->{errors};
84 return;
85 }
86 require OpenBSD::Ustar;
87 my $archive = OpenBSD::Ustar->new($fh, $self->{repository}{state});
88 $archive->set_description($self->{repository}->url($self->{name}));
89 $self->{_archive} = $archive;
90 $self->_set_callback;
91
92 if (defined $self->{_current_name}) {
93 while (my $e = $self->{_archive}->next) {
94 if ($e->{name} eq $self->{_current_name}) {
95 $self->{_current} = $e;
96 return $self;
97 }
98 }
99 }
100 return $self;
101}
102
103sub _set_callback
104{
105 my $self = shift;
106 if (defined $self->{callback} && defined $self->{_archive}) {
107 $self->{_archive}->set_callback($self->{callback});
108 }
109}
110
111sub find_contents
112{
113 my ($self, $extra) = @_;
114
115 while (my $e = $self->next) {
116 if ($e->isFile && is_info_name($e->{name})) {
117 if ($e->{name} eq CONTENTS ) {
118 my $v =
119 $self->{extra_content}.$e->contents($extra);
120 return $v;
121 }
122 } else {
123 $self->unput;
124 last;
125 }
126 }
127}
128
129sub contents
130{
131 my ($self, $extra) = @_;
132 if (!defined $self->{contents}) {
133 if (!$self->_opened) {
134 return;
135 }
136 if (defined $extra) {
137 my $contents = $self->find_contents($extra);
138 if ($contents) {
139 $self->unput;
140 }
141 return $contents;
142 }
143 $self->{contents} = $self->find_contents;
144 }
145
146 return $self->{contents};
147}
148
149sub grab_info
150{
151 my $self = shift;
152 my $dir = $self->{dir} = OpenBSD::Temp->dir;
153
154 my $c = $self->contents;
155 if (!defined $c) {
156 return 0;
157 }
158
159 if (! -f $dir.CONTENTS) {
160 open my $fh, '>', $dir.CONTENTS or die "Permission denied";
161 print $fh $self->contents;
162 close $fh;
163 }
164
165 while (my $e = $self->next) {
166 if ($e->isFile && is_info_name($e->{name})) {
167 $e->{name} = $dir.$e->{name};
168 undef $e->{mtime};
169 undef $e->{atime};
170 eval { $e->create; };
171 if ($@) {
172 unlink($e->{name});
173 $@ =~ s/\s+at.*//o;
174 $self->{repository}{state}->errprint('#1', $@);
175 return 0;
176 }
177 } else {
178 $self->unput;
179 last;
180 }
181 }
182 return 1;
183}
184
185sub grabPlist
186{
187 my ($self, $code) = @_;
188
189 my $plist = $self->plist($code);
190 if (defined $plist) {
191 $self->wipe_info;
192 $self->close_now;
193 return $plist;
194 } else {
195 return;
196 }
197}
198
199sub forget
200{
201 my $self = shift;
202 $self->wipe_info;
203 $self->close_now;
204}
205
206sub wipe_info
207{
208 my $self = shift;
209 $self->{repository}->wipe_info($self);
210 $self->{repository}->close_now($self);
211 delete $self->{contents};
212 $self->deref;
213 delete $self->{_current_name};
214 delete $self->{update_info};
215 delete $self->{_unput};
216}
217
218sub info
219{
220 my $self = shift;
221
222 if (!defined $self->{dir}) {
223 $self->grab_info;
224 }
225 return $self->{dir};
226}
227
228sub plist
229{
230 my ($self, $code, $extra) = @_;
231 require OpenBSD::PackingList;
232
233 if (defined $self->{dir} && -f $self->{dir}.CONTENTS) {
234 my $plist =
235 OpenBSD::PackingList->fromfile($self->{dir}.CONTENTS,
236 $code);
237 $plist->set_infodir($self->{dir});
238 return $plist;
239 }
240 if (my $value = $self->contents($extra)) {
241 return OpenBSD::PackingList->fromfile(\$value, $code);
242 }
243 # hopeless
244 $self->close_with_client_error;
245
246 return;
247}
248
249sub close
250{
251 my ($self, $hint) = @_;
252 $self->{repository}->close($self, $hint);
253}
254
255sub finish_and_close
256{
257 my $self = shift;
258 $self->{repository}->finish_and_close($self);
259}
260
261sub close_now
262{
263 my $self = shift;
264 $self->{repository}->close_now($self);
265}
266
267sub close_after_error
268{
269 my $self = shift;
270 $self->{repository}->close_after_error($self);
271}
272
273sub close_with_client_error
274{
275 my $self = shift;
276 $self->{repository}->close_with_client_error($self);
277}
278
279sub deref
280{
281 my $self = shift;
282 delete $self->{fh};
283 delete $self->{pid2};
284 delete $self->{_archive};
285 delete $self->{_current};
286}
287
288# proxy for archive operations
289sub next
290{
291 my $self = shift;
292
293 if (!$self->_opened) {
294 return;
295 }
296 if (!$self->{_unput}) {
297 $self->{_current} = $self->getNext;
298 if (defined $self->{_current}) {
299 $self->{_current_name} = $self->{_current}{name};
300 } else {
301 delete $self->{_current_name};
302 }
303 } else {
304 $self->{_unput} = 0;
305 }
306 return $self->{_current};
307}
308
309sub unput
310{
311 my $self = shift;
312 $self->{_unput} = 1;
313}
314
315sub getNext
316{
317 my $self = shift;
318
319 return $self->{_archive}->next;
320}
321
322sub skip
323{
324 my $self = shift;
325 return $self->{_archive}->skip;
326}
327
328sub set_callback
329{
330 my ($self, $code) = @_;
331 $self->{callback} = $code;
332 $self->_set_callback;
333}
334
335package OpenBSD::PackageLocation::Installed;
33617µsour @ISA = qw(OpenBSD::PackageLocation);
337
338
339sub info
340{
341 my $self = shift;
342 require OpenBSD::PackageInfo;
343 $self->{dir} = OpenBSD::PackageInfo::installed_info($self->name);
344}
345
346sub plist
347{
348 my ($self, $code) = @_;
349 require OpenBSD::PackingList;
350 return OpenBSD::PackingList->from_installation($self->name, $code);
351}
352
35316µs1;