@ISA = qw(Exporter);
@EXPORT = qw(parse_file print_rpcrelations parse_foptions
%ll_subsystems %subsysnum %trace_masks $e_subsys $e_mask
- $e_processor $e_time $e_file $e_line $e_function $e_pid
+ $e_time $e_displaystr $e_function $e_pid
$e_stack $e_fmtstr $e_backref $e_marked $e_treeparent
$e_numchildren $e_youngestchild $e_next $e_pidhead
$e_rpcsndrcv $e_rpcpid $e_rpcxid $e_rpcnid $e_rpcopc
($e_subsys,
$e_mask,
- $e_processor,
$e_time,
- $e_file,
- $e_line,
+ $e_displaystr,
$e_function,
$e_pid,
$e_stack,
$e_next,
$e_backref,
$e_marked,
- $e_rpcref) = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17);
+ $e_rpcref) = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
($e_rpcuuid,
$e_rpcxid,
$COMPLETED = "Completed";
$HANDLING = "Handling";
$HANDLED = "Handled";
-$RPCREGEX = qr/^\s*($SENDING|$HANDLING|$HANDLED|$COMPLETED)\sRPC\scluuid:pid:xid:ni:nid:opc\s([-\w]+):(\d+):(?:0x)?(\w+):(?:\w+):(?:0x)?(\w+):(\d+)\s*$/;
+$RPCREGEX = qr/($SENDING|$HANDLING|$HANDLED|$COMPLETED)\sRPC\scluuid:pid:xid:ni:nid:opc\s([-\w]+):(\d+):(?:0x)?(\w+):(?:\w+):(?:0x)?(\w+):(\d+)/;
#VFS REGEX BELOW
my $lineref = shift;
my $pidprevious = shift;
+
if ($lineref->[$e_stack] < $pidprevious->[$e_stack]) {
# lineref is not a child of pidprevious, find its parent
while($lineref->[$e_stack] < $pidprevious->[$e_stack]) {
}
$pidprevious->[$e_youngestchild] = $lineref;
$lineref->[$e_pidhead] = $pidprevious;
+
}
$ldlmref->{$newkey} = $ldlmref->{$lineref->[$e_pid]};
$ldlmcontent = $ldlmref->{$newkey};
delete $ldlmref->{$lineref->[$e_pid]};
- #print "$newkey, CONTENT: $ldlmcontent->[$e_resname], $ldlmcontent->[$e_ltype],",
- #"$ldlmcontent->[$e_mreq], $ldlmcontent->[$e_mgranted]\n";
+
}
}
my $rpcref = shift;
my $ldlmref = shift;
my $lineref = shift;
- my $filename = shift;
+
my $tmpfmtref;
+
if ($lineref->[$e_fmtstr] =~ $RPCREGEX) {
my $rpcuuid =$2;
} elsif ($lineref->[$e_fmtstr] =~ qr/### /) {
update_ldlm($ldlmref, $lineref);
}
+
}
sub update_debugreqs
}
-sub process_array
+sub process_array
{
my $newarrayref = shift @_;
my $pidhashref = shift @_;
my %lastline; # Hash of last line by pid
print STDERR "Building PID/RPC list.....\n";
- $debugreq = 0;
- $filearrayidx = 0;
+
+ my $filearrayidx = 0;
while ($filearrayidx <= $#$newarrayref) {
- $arrayref = $newarrayref->[$filearrayidx];
- $arrayindex = 0;
+ my $arrayref = $newarrayref->[$filearrayidx];
+ my $arrayindex = 0;
+ my $start = times();
while ($arrayindex <= $#$arrayref) {
- $actualidx = ($arrayindex+$start_idx[$filearrayidx])%($#$arrayref+1);
- $lineref = $arrayref->[$actualidx];
+ my $actualidx = ($arrayindex+$start_idx[$filearrayidx])%($#$arrayref+1);
+ my $lineref = $arrayref->[$actualidx];
$arrayindex++;
next if ($lineref->[$e_time] == 0); #Ignoring all filemarker lines
next if ($lineref->[$e_fmtstr] eq $INVALID);
$marker_ref->{$lineref->[$e_time]} = [$1, $2, $lineref];
}
# Match DEBUGREQ Lines
- elsif ($lineref->[$e_fmtstr] =~ qr/@@@ /) {
- $debugreq++;
- update_debugreqs($rpc_ref, $lineref);
- }
+ #elsif ($lineref->[$e_fmtstr] =~ qr/@@@ /) {
+ #$debugreq++;
+ #update_debugreqs($rpc_ref, $lineref);
+ #}
# Is this a process name ?
- else {
+ elsif (($lineref->[$e_fmtstr] =~ qr/($SENDING|$HANDLING|$HANDLED|$COMPLETED)/) ||
+ (($lineref->[$e_fmtstr] =~ $LDLM_REGEX))
+ ) {
+ update_RPC($rpc_ref, $ldlm_ref, $lineref);
+ } else {
my $tagged_pid = $lineref->[$e_pid];
$tagged_pid =~ /(\d+):(.+)/;
my $numericpid = $1;
}
}
}
- # Match RPCs
- else {
- update_RPC($rpc_ref, $ldlm_ref, $lineref);
- }
}
# For all lines create parent/child relations
setup_relations($lineref, $pidprevious);
# Remember last line for this pid
$lastline{$lineref->[$e_pid]} = $lineref;
}
+ my $end = times();
+ my $tottime = $end-$start;
+ my $fileline = $arrayref->[0]->[$e_fmtstr];
+ print STDERR "Processed $fileline, time: $tottime\n";
$filearrayidx++;
}
}
-sub process_HTMLtext
+sub HTML_leftpane
{
my $htmfile = shift;
- my $pidhashref = shift;
- if ($htmfile ne "") {
- my $previous_pidfilename = "";
- my $htmlfilename = sprintf "%s_left.html", $htmfile;
- open (HTML, ">$htmlfilename");
- print HTML "<HTML>";
- print HTML "<HEAD>";
- print HTML "<TITLE> llhtml view </TITLE>";
- print HTML "</HEAD>";
- print HTML "<BODY>\n";
- foreach $pid (sort (sort_by_number_descending keys %$pidhashref)) {
- # print STDERR "pid: $pid \[$pidhashref->{$pid}->[$e_pidcmd]\]\n";
- my $linecnt = 0;
- my $pidlines_ref = $pidhashref->{$pid}->[$e_lineref];
- my $next = 0;
- do {
- $next = $pidlines_ref->[$e_next];
- $linecnt++;
- $pidlines_prev = $pidlines_ref;
- $pidlines_ref = $next;
- } until ($next == 0);
- $pid =~ /(\d+):(.+)/;
- my $numericpid = $1;
- my $pidfname = $2;
- my $graphhtmfile = join('_', split (/[\/, \.]/, $pidfname));
- if ($numericpid) { # Skip pid 0 which are the lines listing all PIDs
- #print STDERR "pid=$numericpid \[$pidhashref->{$pid}->[$e_pidcmd]\] lines=$linecnt ($pidfname)\n";
- # Generate HTML Index Pane
- if ($previous_pidfilename ne $pidfname) {
- print HTML "<H3><A HREF = \"${htmfile}_${graphhtmfile}.html\" target=\"right\">$pidfname</A></H3>\n";
- $previous_pidfilename = $pidfname;
- }
- my $anchorlinkpid = join('_', split(/[\/,:, \.]/, $pid));
- print HTML "<a href = \"${htmfile}_right.html#$anchorlinkpid\" target=\"right\">$numericpid</a> \[$pidhashref->{$pid}->[$e_pidcmd]\]<br>\n";
+ my $arrayref = shift;
+ my $pidref = shift;
+ my $nograph = shift;
+ my $arrayindex = 0;
+
+ # Create the left pane HTML file
+ $htmlfilename = sprintf "%s_left.html", $htmfile;
+ open (LEFTHTML, ">$htmlfilename");
+ print LEFTHTML "<HTML>";
+ print LEFTHTML "<HEAD>";
+ print LEFTHTML "<TITLE> llhtml view </TITLE>";
+ print LEFTHTML "</HEAD>";
+ print LEFTHTML "<BODY>\n";
+
+ while ($arrayindex <= $#$arrayref) {
+ my $fileline = $arrayref->[$arrayindex]->[0];
+ my $graphhtmfile = $fileline->[$e_fmtstr];
+ my $fmtline = $fileline->[$e_pid];
+ my @pidlist = split(/,/, $fmtline);
+ my $element = $pidlist[0];
+ $element =~ /(\d+):(.*)/;
+ my $numericpid = $1;
+ if (!$nograph) {
+ print LEFTHTML "<H3><A HREF = \"${htmfile}_${graphhtmfile}.html\" target=\"right\">$2</A></H3>\n";
+ } else {
+ print LEFTHTML "<H3>$2</H3>\n";
+ }
+ for($idx = 1; $idx <= $#pidlist; $idx++) {
+ if ($numericpid) {
+ my $anchorlinkpid = sprintf "%s_%s", ${numericpid}, ${graphhtmfile};
+ print LEFTHTML "<a href = \"${htmfile}_right.html#$anchorlinkpid\" target=\"right\">$numericpid</a>";
+ print LEFTHTML "\[$pidref->{$element}->[$e_pidcmd]\]<br>\n";
}
+ $element = $pidlist[$idx];
+ $element =~ /(\d+):.*/;
+ $numericpid = $1;
}
- print HTML "</BODY>";
- print HTML "</HTML>\n";
- close(HTML);
+ $arrayindex++;
}
+ print LEFTHTML "</BODY>";
+ print LEFTHTML "</HTML>\n";
+ close(LEFTHTML);
}
%gblstarttime;
-sub parse_file
+sub parse_file
{
# File names that need to be slurped
my $input_files = shift;
my $numfiles = 0;
foreach $file (@$input_files) {
my $linecnt = 0;
+ my $curridx = 0;
my $prev_time = 0;
# Initialize the starting index for this file to be zero
$start_idx[$numfiles] = 0;
$fileline = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
$new_file = join('_', split(/[\/, \.]/, $file));
$fileline->[$e_fmtstr] = $new_file;
+ $start = times();
push @{$array_parsed->[$numfiles]}, $fileline;
while(<FILEHANDLE>) {
$linecnt++;
if (!exists($gblstarttime{$new_file})) {
$gblstarttime{$new_file} = $parsed_line[$e_time];
}
-
+ $curridx++;
if ($prev_time > $parsed_line[$e_time]) {
# Wrapped log
if ($start_idx[$numfiles] != 0) {
exit;
}
print STDERR "Wrapped log at $linecnt in file $file\n";
- $start_idx[$numfiles] = $linecnt; # Accounting for the dummy file line
+ $start_idx[$numfiles] = $curridx; # Accounting for the dummy file line
$gblstarttime{$new_file} = $parsed_line[$e_time];
# Invalidate all the pid marker lines for this file, until now
@pids_file = split(/,/, $fileline->[$e_pid]);
my @marker_line;
$marker_line[$e_subsys] = 0;
$marker_line[$e_mask] = 0;
- $marker_line[$e_processor] = 0;
$marker_line[$e_time] = $parsed_line[$e_time];
- $marker_line[$e_file] = 0;
- $marker_line[$e_line] = 0;
+ $marker_line[$e_displaystr] = 0;
$marker_line[$e_function] = 0;
$marker_line[$e_pid] = $parsed_line[$e_pid];
# marker lines are everyone's parent, so stack value zero
$marker_line[$e_numchildren] = 0;
$marker_line[$e_youngestchild] = 0;
$marker_line[$e_pidhead] = 0;
- $marker_line[$e_next]= 0; # No, no, no: \@parsed_line;
+ $marker_line[$e_next]= 0;
$marker_line[$e_backref] = 0;
$marker_line[$e_marked] = 0;
$pid_ref->{$parsed_line[$e_pid]}->[$e_lineref] = $marker_line;
}
}
close(FILEHANDLE);
+ $end = times();
+ $tottime = $end - $start;
+ print STDERR "Parsed $file in $tottime\n";
$numfiles++;
}
return $array_parsed;
}
-sub process_HTMLgraph
+sub HTML_graph
{
my $gbl_array_parsed = shift;
my $htmfile = shift;
my $pid_ref = shift;
-
+ my $start = times();
my $file_idx = 0;
while ($file_idx <= $#$gbl_array_parsed) {
$array_parsed = $gbl_array_parsed->[$file_idx];
$newtime = $newtime + $more;
} else {
#Find if the current timebase will exceed the end of this RPC
-
print GRAPHHTML "<td valign=\"top\" width=\"$colwidth\%\"><font size=\"-2\">$newtime</font></td>";
$newtime += $timebase;
}
}
}
print GRAPHHTML "</tr>";
-
}
#$currtime = $newtime;
$rpc_line = $lineref->[$e_rpcref];
close (GRAPHHTML);
$file_idx ++;
}
+ my $end = times();
+ my $time = $end-$start;
+ print STDERR "HTML: Graphing $time secs\n";
}
# Parse out the file names given on the command line
my $in_line = shift;
if ($in_line =~ /$REGEX/) {
my $tagged_pid = "${8}:${file}";
- @parsed_line = ($1, $2, $3, $4, $5, $6, $7, $tagged_pid, $9, $10,
+ my $display_str = "${5}:{6}";
+ @parsed_line = ($1, $2, $4, $display_str, $7, $tagged_pid, $9, $10,
0, 0, 0, 0, 0, 0, 0, 0);
#print "$1, $2, $3, $4, $5, $6, $7, $8, $9, $10\n";
} else {
chop $in_line;
- print "Mismatch in the host file (file:$file, line:$linecnt)\n",
- "\tOffending line: <$in_line>\n";
+ print "MALFORMED LINE :$in_line IN FILE :$file @ $linecnt\n";
return 0;
return @parsed_line;
}
}
my $summary_indent = 0;
-my $summary_indent_string = " ";
+my $summary_indent_string = " ";
$BREAK_LDLM_REGEXP=qr/(LDLM.+\) => \([^\(]+\))(.+)/;
-sub printHTML
+sub HTML_rightpane
{
my $text = shift;
my $HTMHANDLE = shift;
$newtag = join('_', split(/[\/, \.]/, $tmp[0]));
$anchortag = sprintf "%s_%s", $1, $newtag;
print $HTMHANDLE "<A NAME = \"$anchortag\">";
- for ($i=0; $i < $summary_indent; $i++) {
- $htmlspacing = sprintf "%s", $summary_indent_string;
- print $HTMHANDLE "$htmlspacing";
- }
+ print $HTMHANDLE $summary_indent_string x $summary_indent;
print $HTMHANDLE "$text\n</A>";
} elsif ($text =~ /rpcxid #(\d+)(.*)/) {
if ($text =~ /link=/) {
$tmprpc = shift;
$pidhashref = shift;
+ my $allexist = ($tmprpc->[$e_srvRPCent] &&
+ $tmprpc->[$e_srvRPCexit] &&
+ $tmprpc->[$e_cliRPCent] &&
+ $tmprpc->[$e_cliRPCexit]);
if ($tmprpc->[$e_rpcopc] < 104) {
$anchortag = sprintf "%s_%s_%s_%s",
$tmprpc->[$e_rpcopc], $tmprpc->[$e_rpcxid],
}
my $rpcpidname = ($tmprpc->[$e_cliRPCent])->[$e_pid];
my $clipidcmdname = ($pidhashref->{$rpcpidname})->[$e_pidcmd];
- print $HTMHANDLE "<A NAME = \"$anchortag\">";
- for ($i=0; $i < $summary_indent; $i++) {
- $htmlspacing = sprintf "%s", $summary_indent_string;
- print $HTMHANDLE "$htmlspacing";
+ if ($allexist) {
+ print $HTMHANDLE "<A NAME = \"$anchortag\">";
}
+ print $HTMHANDLE $summary_indent_string x $summary_indent;
# Creating back reference to the client
$text =~ qr/(rpcxid\s)(#\d+)(.+)\(link=.+\)/;
- print $HTMHANDLE "</A>[${clipidcmdname}]:<A HREF = \"#cli_$anchortag\">xid $2</A>";
+ print $HTMHANDLE "[${clipidcmdname}]:";
+ if ($allexist) {
+ print $HTMHANDLE "</A><A HREF = \"#cli_$anchortag\">";
+ }
+ print $HTMHANDLE "xid $2";
+ if ($allexist) {
+ print $HTMHANDLE "</A>";
+ }
my $rpctext = $3;
if ($rpctext =~ /LDLM_.+/) {
$rpctext =~ $BREAK_LDLM_REGEXP;
print $HTMHANDLE " $1\n";
- for ($i=0; $i < $summary_indent; $i++) {
- $htmlspacing = sprintf "%s", $summary_indent_string;
- print $HTMHANDLE "$htmlspacing";
- }
+ print $HTMHANDLE $summary_indent_string x $summary_indent;
print $HTMHANDLE " $2\n";
} else {
print $HTMHANDLE "$rpctext\n";
}
- #@newtext = split(qr/link=/, $text);
- # print $HTMHANDLE "$newtext[0]</A><A HREF = \"#cli_$anchortag\">link=$newtext[1]\n</A>";
} else {
$tmprpc = shift;
if ($tmprpc->[$e_rpcopc] < 104) {
$anchorref = sprintf "%s_%s_%s",
$tmprpc->[$e_rpcopc], $tmprpc->[$e_rpcxid], $tmprpc->[$e_rpcpid];
}
- print $HTMHANDLE "<A NAME = \"cli_$anchorref\">";
- for ($i=0; $i < $summary_indent; $i++) {
- $htmlspacing = sprintf "%s", $summary_indent_string;
- print $HTMHANDLE "$htmlspacing";
+ # Only true if the server entry is not zero
+ if ($allexist) {
+ print $HTMHANDLE "<A NAME = \"cli_$anchorref\">";
+ }
+ print $HTMHANDLE $summary_indent_string x $summary_indent;
+ if ($allexist) {
+ print $HTMHANDLE "</A><A HREF = \"#$anchorref\">";
+ }
+ print $HTMHANDLE "rpcxid #$1";
+ if ($allexist) {
+ print $HTMHANDLE "</A>";
}
- print $HTMHANDLE "</A><A HREF = \"#$anchorref\">rpcxid #$1</A>";
my $rpctext = $2;
if ($rpctext =~ /LDLM_.+/) {
$rpctext =~ $BREAK_LDLM_REGEXP;
print $HTMHANDLE " $1\n";
- for ($i=0; $i < $summary_indent; $i++) {
- $htmlspacing = sprintf "%s", $summary_indent_string;
- print $HTMHANDLE "$htmlspacing";
- }
+ print $HTMHANDLE $summary_indent_string x $summary_indent;
print $HTMHANDLE " $2\n";
} else {
print $HTMHANDLE "$rpctext\n";
}
}
} elsif ($text =~ qr/\+\+\+marker\[([^\]]*)\](.*)/) {
- for ($i=0; $i < $summary_indent; $i++) {
- $htmlspacing = sprintf "%s", $summary_indent_string;
- print $HTMHANDLE "$htmlspacing";
- }
+ print $HTMHANDLE $summary_indent_string x $summary_indent;
print $HTMHANDLE "+++marker\[<A HREF = \"#$1\">$1</A>\]$2\n";
} elsif ($text =~ qr/\+\+\+marker summary\[([^\]]*)\](.*)/ ){
print $HTMHANDLE "<A NAME = \"$1\">";
- for ($i=0; $i < $summary_indent; $i++) {
- $htmlspacing = sprintf "%s", $summary_indent_string;
- print $HTMHANDLE "$htmlspacing";
- }
+ print $HTMHANDLE $summary_indent_string x $summary_indent;
print $HTMHANDLE "+++marker summary\[$1\]$2</A>";
}else{
- for ($i=0; $i < $summary_indent; $i++) {
- $htmlspacing = sprintf "%s", $summary_indent_string;
- print $HTMHANDLE "$htmlspacing";
- }
+ print $HTMHANDLE $summary_indent_string x $summary_indent;
print $HTMHANDLE "$text\n";
}
print $HTMHANDLE "</PRE>";
my $i;
# Print the regular stuff
- for ($i=0; $i < $summary_indent; $i++) {
- printf "%s", $summary_indent_string;
- }
+ print $summary_indent_string x $summary_indent;
print "$text\n";
-
# Print HTML
if ($HTMHANDLE) {
- printHTML($text, $HTMHANDLE, $temprpc, $pidhashref);
+ HTML_rightpane($text, $HTMHANDLE, $temprpc, $pidhashref);
}
}
my $ldlmdebug = shift;
my $htmfile = shift;
+ my $start = times();
# HTML stuff
if ($htmfile ne "") {
my $htmfilename = sprintf "%s_right.html", $htmfile;
}
# $lineref = getnextchild($vfs_line, $lineref);
my $next = $lineref->[$e_next];
+
+ if ($lineref->[$e_fmtstr] = "") {
+ $lineref = $next;
+ next;
+ }
# LDLM ?
if (($ldlmdebug) && (exists($ldlm_ref->{$lineref->[$e_time]}))) {
# Needs to get better
print HTMLOG "</BODY></HTML>";
close(HTMLOG);
}
+
+ my $end = times();
+ my $tottime = $end-$start;
+ print STDERR "ASCII generation: $tottime\n";
}
sub print_rpc {
}
}
-sub gen_webpage {
+sub gen_HTML
+{
my $htmname = shift;
if ($htmname ne "") {
my $mainhtml = sprintf "%s.html", $htmname;
print HTMHANDLE "<FRAMESET COLS=\"20%, 80%\">";
print HTMHANDLE "<FRAME NAME=\"left\" SRC=\"${htmname}_left.html\">";
print HTMHANDLE "<FRAME NAME=\"right\" SRC=\"${htmname}_right.html\">";
- print HTMLHANDEL "</FRAMESET></HTML>";
+ print HTMHANDLE "</FRAMESET></HTML>";
}
}
-1;
+
+
+
+1;