semastats.prl 3.08 KB
#!/usr/local/bin/perl5 -w
#
# Copyright (C) 1996-1998 by the Board of Trustees
#    of Leland Stanford Junior University.
# 
# This file is part of the SimOS distribution. 
# See LICENSE file for terms of the license. 
#

%semaInfo = ();

$inputFile = "cpu.log";
$numsemas = -1;
$found = 0;

$i=0;
while ($i<=$#ARGV) {
    if ($ARGV[$i] eq "-f") {
        $i++;
        $inputFile = $ARGV[$i];

    } elsif ($ARGV[$i] eq "-l") {
        $i++;
        $showSema{$ARGV[$i]} = 1;

    } elsif ($ARGV[$i] eq "-n") {
        $i++;
        $numsemas = $ARGV[$i];

    } else {
        print "usage: semastats [-f file] [-l sema] [-n numsemas]\n";
        exit;
    }

    $i++;
}

open(LOGFILE, $inputFile);

while (<LOGFILE>) {
    if (/^SEMASTATS: \s+ start/x) {
        undef %semaInfo;
        $total = 0;
        $found++;
        
    } elsif (/^SEMASTATS:\s+sema\s+(\S+)\s+n\s+(\d+)\s+sumX\s+(\S+)\s+sumY\s+\S+\s+sumXX\s+(\S+)\s+sumYY\s+\S+\s+sumXY\s+\S+\s+minX\s+(\S+)\s+maxX\s+(\S+)\s+minY\s+\S+\s+maxY\s+\S+\s+/) {
        $sema = $1;
        $total += $3;

        $semaInfo{$sema}{'name'} = $sema;
        $semaInfo{$sema}{'nwait'} = $2;
        $semaInfo{$sema}{'totwait'} = $3;
        $semaInfo{$sema}{'sqwait'} = $4;
        $semaInfo{$sema}{'minwait'} = $5;
        $semaInfo{$sema}{'maxwait'} = $6;
        if (!defined($semaInfo{$sema}{'iname'})) {
            $semaInfo{$sema}{'iname'} = "";
            $semaInfo{$sema}{'caller'} = "";
        }            
    } elsif (/^SEMAINIT:\s+(\S+)\s+\S+\s+\S+\s+(\S+)\s+(\S+)/) {
        $sema = $1;

        $semaInfo{$sema}{'iname'} = $2;
        $semaInfo{$sema}{'caller'} = $3;
        $semaInfo{$sema}{'name'} = $sema;
        $semaInfo{$sema}{'nwait'} = 0;
        $semaInfo{$sema}{'totwait'} = 0;
        $semaInfo{$sema}{'sqwait'} = 0;
        $semaInfo{$sema}{'minwait'} = 0;
        $semaInfo{$sema}{'maxwait'} = 0;
    }
}

close(LOGFILE);

if (!$found) {
    print "FATAL ERROR: no semastats stuff found, you must not have source'd sema_stats.tcl\n";
}

$num = 0;
    
printHeader();

foreach $sema (sort bywait (keys %semaInfo)) {
    if ($semaInfo{$sema}{'nwait'} == 0) {
        next;
    }

    $num++;
    
    if (($numsemas != -1) && defined(%showSema)) {
        if (($num > $numsemas) && !defined($showSema{$sema})) {
            next;
        }

    } elsif (($numsemas != -1) && ($num > $numsemas)) {
        next;
        
    } elsif (defined(%showSema) && !defined($showSema{$sema})) {
        next;
    }

    printSema($semaInfo{$sema}, $num, "");
}

sub bywait {
    $semaInfo{$b}{'totwait'} <=> $semaInfo{$a}{'totwait'};
}


sub printHeader {
    printf "%-4s %-15s %6s %7s %-15s %-10s %-15s\n",
    "num", "sema",
    "% of sema", "count", "wait", "Name", "Init";

    print "-----------------------------------------------------------------------------\n";
}

sub printSema {
    my($bucket, $num, $prefix) = @_;
    printf "%-4s %-15s %6.2f %7d %15.2f %-10s %-15s\n",
    $num,
    "$bucket->{'name'}", (100.0 * $bucket->{'totwait'}) / $total, $bucket->{'nwait'},
    $bucket->{'totwait'} / $bucket->{'nwait'}, $bucket->{'iname'}, $bucket->{'caller'};
}