#!/usr/bin/perl
#
# Scrub the variable fields from the perf trace2 output to
# make testing easier.
use strict;
use warnings;
my $qpath = '\'[^\']*\'|[^ ]*';
my $col_depth=0;
my $col_thread=1;
my $col_event=2;
my $col_repo=3;
my $col_t_abs=4;
my $col_t_rel=5;
my $col_category=6;
my $col_rest=7;
# This code assumes that the trace2 data was written with bare
# turned on (which omits the "<clock> <file>:<line> | <parents>"
# prefix.
while (<>) {
my @tokens = split /\|/;
foreach my $col (@tokens) { $col =~ s/^\s+|\s+$//g; }
if ($tokens[$col_event] =~ m/^start/) {
# The 'start' message lists the contents of argv in $col_rest.
# On some platforms (Windows), argv[0] is *sometimes* a canonical
# absolute path to the EXE rather than the value passed in the
# shell script. Replace it with a placeholder to simplify our
# HEREDOC in the test script.
my $argv0;
my $argvRest;
$tokens[$col_rest] =~ s/^($qpath)\W*(.*)/_EXE_ $2/;
}
elsif ($tokens[$col_event] =~ m/cmd_path/) {
# Likewise, the 'cmd_path' message breaks out argv[0].
#
# This line is only emitted when RUNTIME_PREFIX is defined,
# so just omit it for testing purposes.
# $tokens[$col_rest] = "_EXE_";
goto SKIP_LINE;
}
elsif ($tokens[$col_event] =~ m/cmd_ancestry/) {
# 'cmd_ancestry' is platform-specific and not implemented everywhere,
# so skip it.
goto SKIP_LINE;
}
elsif ($tokens[$col_event] =~ m/child_exit/) {
$tokens[$col_rest] =~ s/ pid:\d* / pid:_PID_ /;
}
elsif ($tokens[$col_event] =~ m/data/) {
if ($tokens[$col_category] =~ m/process/) {
# 'data' and 'data_json' events containing 'process'
# category data are assumed to be platform-specific
# and highly variable. Just omit them.
goto SKIP_LINE;
}
if ($tokens[$col_category] =~ m/fsync/) {
# fsync events aren't interesting for the test
goto SKIP_LINE;
}
}
elsif ($tokens[$col_event] =~ m/timer/) {
# This also captures "th_timer" events
$tokens[$col_rest] =~ s/ total:\d+\.\d*/ total:_T_TOTAL_/;
$tokens[$col_rest] =~ s/ min:\d+\.\d*/ min:_T_MIN_/;
$tokens[$col_rest] =~ s/ max:\d+\.\d*/ max:_T_MAX_/;
}
# t_abs and t_rel are either blank or a float. Replace the float
# with a constant for matching the HEREDOC in the test script.
if ($tokens[$col_t_abs] =~ m/\d/) {
$tokens[$col_t_abs] = "_T_ABS_";
}
if ($tokens[$col_t_rel] =~ m/\d/) {
$tokens[$col_t_rel] = "_T_REL_";
}
my $out;
$out = join('|', @tokens);
print "$out\n";
SKIP_LINE:
}