#!/usr/bin/perl

use strict;
use warnings;

my ($event, $trace);
my %locks;
my $t;

while(<>) {
	chomp;
	next if /^#/;
	if (/^\s+(.*)-\d+\s+\[\d+\]\s+[0-9.]+: (.*) \(([0-9.]+) us\)$/) {
		$locks{$trace} += $t if defined $t;
		$t = $3;
		$trace="$1: $2\n";
		next;
	}
	next unless s/^ => ([^\s])/$1/;
	$trace.="$_\n";
}
$locks{$trace} += $t+0 if defined $t;

foreach (sort { $locks{$b} <=> $locks{$a} } keys %locks) {
	last unless $locks{$_} >= 100000;
	my @bt = split "\n";
	print "--- $locks{$_} us --- $bt[0]\n";
	my $i;
	for ($i = 1; $i <= $#bt; $i++) {
		my $l = $bt[$i];
		if ($l =~ /^(\/.*)\[\+(0x.*)\]$/) {
			my $path = $1;
			my $addr = $2;
			my $code = `addr2line -fe "$path" $addr`;
			my @spam = split("\n", $code);
			if ($? != 0) {
				$code = "$addr";
			} else {
				$code = "$spam[0] - $spam[1]";
			}
			$l = "$path [$code]";
		} elsif ($l =~ /^ /) {
			$l.=" (unknown)";
		} else {
			$l.=" (kernel)";
		}

		print "$l\n";
	}
	print "\n";
}