#!/usr/athena/bin/perl

while (<STDIN>) {
    last if (/processing/);
}

while (<STDIN>) {
    if (/^(0x[0-9a-f]+): \([0-9]+\) (malloc|realloc) ([0-9]+) bytes/) {
	$line{$1} = $cur_line;
	$line_no{$1} = $cur_line_no;
	$alloc_counts{$cur_line_no}++;
	$size{$1} = $3;
	next;
    }
    elsif (/^(0x[0-9a-f]+): \([0-9]+\) (free|rfree)/) {
	$alloc_counts{$line_no{$1}}--;
	delete $line{$1};
	delete $line_no{$1};
	delete $size{$1};
    }
    elsif (/^([0-9]+) *([^:].*)/) {
	$cur_line = $2;
	$cur_line_no = $1;
	next;
    }
}

for (keys %line_no) {
    $alloc_lines{$line_no{$_}} .=
	"\t$_: ($size{$_} bytes) $line_no{$_} $line{$_}\n";
}

print "Top 10 lines with unfreed memory:\n\n";

$i = 0;

for (reverse sort { $alloc_counts{$a} <=> $alloc_counts{$b}; } 
     keys %alloc_counts) {
    last if ($i == 10);
    print "$_ ($alloc_counts{$_}):\n$alloc_lines{$_}";
    $i++;
}

