summaryrefslogtreecommitdiff
path: root/Master/tlpkg/tlperl0/lib/IPC/Run3/ProfReporter.pm
diff options
context:
space:
mode:
Diffstat (limited to 'Master/tlpkg/tlperl0/lib/IPC/Run3/ProfReporter.pm')
-rwxr-xr-xMaster/tlpkg/tlperl0/lib/IPC/Run3/ProfReporter.pm256
1 files changed, 256 insertions, 0 deletions
diff --git a/Master/tlpkg/tlperl0/lib/IPC/Run3/ProfReporter.pm b/Master/tlpkg/tlperl0/lib/IPC/Run3/ProfReporter.pm
new file mode 100755
index 00000000000..2fa9060e1e4
--- /dev/null
+++ b/Master/tlpkg/tlperl0/lib/IPC/Run3/ProfReporter.pm
@@ -0,0 +1,256 @@
+package IPC::Run3::ProfReporter;
+
+$VERSION = 0.043;
+
+=head1 NAME
+
+IPC::Run3::ProfReporter - base class for handling profiling data
+
+=head1 SYNOPSIS
+
+=head1 DESCRIPTION
+
+See L<IPC::Run3::ProfPP|IPC::Run3::ProfPP> and for an example subclass.
+
+This class just notes and accumulates times; subclasses use methods like
+"handle_app_call", "handle_run_exit" and "handle_app_exit" to emit reports on
+it. The default methods for these handlers are noops.
+
+If run from the command line, a reporter will be created and run on
+each logfile given as a command line parameter or on run3.out if none
+are given.
+
+This allows reports to be run like:
+
+ perl -MIPC::Run3::ProfPP -e1
+ perl -MIPC::Run3::ProfPP -e1 foo.out bar.out
+
+Use "-" to read from STDIN (the log file format is meant to be moderately
+greppable):
+
+ grep "^cvs " run3.out perl -MIPC::Run3::ProfPP -e1 -
+
+Use --app to show only application level statistics (ie don't emit
+a report section for each command run).
+
+=cut
+
+use strict;
+
+my $loaded_by;
+
+sub import {
+ $loaded_by = shift;
+}
+
+END {
+ my @caller;
+ for ( my $i = 0;; ++$i ) {
+ my @c = caller $i;
+ last unless @c;
+ @caller = @c;
+ }
+
+ if ( $caller[0] eq "main"
+ && $caller[1] eq "-e"
+ ) {
+ require IPC::Run3::ProfLogReader;
+ require Getopt::Long;
+ my ( $app, $run );
+
+ Getopt::Long::GetOptions(
+ "app" => \$app,
+ "run" => \$run,
+ );
+
+ $app = 1, $run = 1 unless $app || $run;
+
+ for ( @ARGV ? @ARGV : "" ) {
+ my $r = IPC::Run3::ProfLogReader->new(
+ Source => $_,
+ Handler => $loaded_by->new(
+ Source => $_,
+ app_report => $app,
+ run_report => $run,
+ ),
+ );
+ $r->read_all;
+ }
+ }
+}
+
+=head1 METHODS
+
+=over
+
+=item C<< IPC::Run3::ProfReporter->new >>
+
+Returns a new profile reporting object.
+
+=cut
+
+sub new {
+ my $class = ref $_[0] ? ref shift : shift;
+ my $self = bless { @_ }, $class;
+ $self->{app_report} = 1, $self->{run_report} = 1
+ unless $self->{app_report} || $self->{run_report};
+
+ return $self;
+}
+
+=item C<< $reporter->handle_app_call( ... ) >>
+
+=item C<< $reporter->handle_app_exit( ... ) >>
+
+=item C<< $reporter->handle_run_exit( ... ) >>
+
+These methods are called by the handled events (see below).
+
+=cut
+
+sub handle_app_call {}
+sub handle_app_exit {}
+
+sub handle_run_exit {}
+
+=item C<< $reporter->app_call(\@cmd, $time) >>
+
+=item C<< $reporter->app_exit($time) >>
+
+=item C<< $reporter->run_exit(@times) >>
+
+ $self->app_call( $time );
+ my $time = $self->get_app_call_time;
+
+Sets the time (in floating point seconds) when the application, run3(),
+or system() was called or exited. If no time parameter is passed, uses
+IPC::Run3's time routine.
+
+Use get_...() to retrieve these values (and _accum values, too). This
+is a separate method to speed the execution time of the setters just a
+bit.
+
+=cut
+
+sub app_call {
+ my $self = shift;
+ ( $self->{app_cmd}, $self->{app_call_time} ) = @_;
+ $self->handle_app_call if $self->{app_report};
+}
+
+sub app_exit {
+ my $self = shift;
+ $self->{app_exit_time} = shift;
+ $self->handle_app_exit if $self->{app_report};
+}
+
+sub run_exit {
+ my $self = shift;
+ @{$self}{qw(
+ run_cmd run_call_time sys_call_time sys_exit_time run_exit_time
+ )} = @_;
+
+ ++$self->{run_count};
+ $self->{run_cumulative_time} += $self->get_run_time;
+ $self->{sys_cumulative_time} += $self->get_sys_time;
+ $self->handle_run_exit if $self->{run_report};
+}
+
+=item C<< $reporter->get_run_count() >>
+
+=item C<< $reporter->get_app_call_time() >>
+
+=item C<< $reporter->get_app_exit_time() >>
+
+=item C<< $reporter->get_app_cmd() >>
+
+=item C<< $reporter->get_app_time() >>
+
+=cut
+
+sub get_run_count { shift->{run_count} }
+sub get_app_call_time { shift->{app_call_time} }
+sub get_app_exit_time { shift->{app_exit_time} }
+sub get_app_cmd { shift->{app_cmd} }
+sub get_app_time {
+ my $self = shift;
+ $self->get_app_exit_time - $self->get_app_call_time;
+}
+
+=item C<< $reporter->get_app_cumulative_time() >>
+
+=cut
+
+sub get_app_cumulative_time {
+ my $self = shift;
+ $self->get_app_exit_time - $self->get_app_call_time;
+}
+
+=item C<< $reporter->get_run_call_time() >>
+
+=item C<< $reporter->get_run_exit_time() >>
+
+=item C<< $reporter->get_run_time() >>
+
+=cut
+
+sub get_run_call_time { shift->{run_call_time} }
+sub get_run_exit_time { shift->{run_exit_time} }
+sub get_run_time {
+ my $self = shift;
+ $self->get_run_exit_time - $self->get_run_call_time;
+}
+
+=item C<< $reporter->get_run_cumulative_time() >>
+
+=cut
+
+sub get_run_cumulative_time { shift->{run_cumulative_time} }
+
+=item C<< $reporter->get_sys_call_time() >>
+
+=item C<< $reporter->get_sys_exit_time() >>
+
+=item C<< $reporter->get_sys_time() >>
+
+=cut
+
+sub get_sys_call_time { shift->{sys_call_time} }
+sub get_sys_exit_time { shift->{sys_exit_time} }
+sub get_sys_time {
+ my $self = shift;
+ $self->get_sys_exit_time - $self->get_sys_call_time;
+}
+
+=item C<< $reporter->get_sys_cumulative_time() >>
+
+=cut
+
+sub get_sys_cumulative_time { shift->{sys_cumulative_time} }
+
+=item C<< $reporter->get_run_cmd() >>
+
+=cut
+
+sub get_run_cmd { shift->{run_cmd} }
+
+=back
+
+=head1 LIMITATIONS
+
+=head1 COPYRIGHT
+
+ Copyright 2003, R. Barrie Slaymaker, Jr., All Rights Reserved
+
+=head1 LICENSE
+
+You may use this module under the terms of the BSD, Artistic, or GPL licenses,
+any version.
+
+=head1 AUTHOR
+
+Barrie Slaymaker <barries@slaysys.com>
+
+=cut
+
+1;