#!/bin/sh

# This function just re-writes the timestamp of the strace entries to be
# seconds.usecs since boot. To match the timestamping of ftrace (so we can
# merge them later).
process_strace()
{
    strace=$1
    # parse in data/system/vendor and parse out /sys/devices/system/...
    egrep '\/system\/|\/data\/|\/vendor\/' $strace | egrep -v '\/sys\/devices\/system\/' > bar
    fgrep -v '= -1' bar > foo
    mv foo bar
    # begin_time is seconds since epoch
    begin_time=`cat trace.begin`
    # replace seconds since epoch with SECONDS SINCE BOOT in the
    # strace files
    awk -v begin="$begin_time" '{ printf "%f strace ", $1 - begin; $1=""; print $0}' bar > $2
    rm bar
}

#
# This function processes the ftrace file, removing the fields that we don't care
# about, breaks up the ftrace file into one file per pid.
# Input : One single fstrace file.
# Output : Multiple fstrace.pid files.
prep_fstrace()
{
    # Remove leading junk
    fgrep f2fs_data $1 | sed 's/^.* \[.*\] //' | sed s/://g | sed s/,//g > foo
    sed 's/f2fs_dataread_start/read/' foo > bar1
    mv bar1 bar
    # First column is timestamp SECONDS SINCE BOOT
    awk '{ print $2, "ftrace", $3, $5, $7, $9, $13 }' bar > foo
    rm bar
    # Get all the uniq pids
    awk '{print $7}' foo | sort | uniq > pidlist
    for i in `cat pidlist`
    do
	awk -v pid=$i '{ if (pid == $7) print $0}' foo > fstrace.$i
    done
    rm pidlist
    rm foo
}

# Merge straces and ftraces.
# The goal here is to catch mmap'ed IO (reads) that won't be in the
# strace file. The algorithm is to look for mmaps in the strace file,
# use the files tha are mmap'ed to search in the ftraces to pick up
# tracepoints from there, and merge those with the straces.
# The output of this function is a set of parsed_input_trace.<pid>
# files, that can then be compiled into .wl files
merge_compile()
{
    for stracefile in trace.*
    do
	if [ $stracefile == trace.begin ] || [ $stracefile == trace.tar ];
	then
	    continue
	fi
	# Get the pid from the strace filename (pid is the extension)
	pid=${stracefile##*.}
	process_strace $stracefile foo.$pid
	if ! [ -s foo.$pid ]; then
	    rm foo.$pid
	    continue
	fi
	#
	# If we have matching strace and ftrace files, then look for mmaps in
	# the strace pluck the corresponding entries for the mmap (mmaped IO)
	# from the ftrace and merge them into the strace
	#
	if [ -f fstrace.$pid ]; then
	    fgrep mmap foo.$pid > bar
	    if [ -s bar ]; then
		# Get all the unique mmap'ed filenames from the strace
		awk '{ print $7 }' bar | sed 's/^[^<]*<//g' | sed 's/>,//g' > mapped_files
		# Pluck all the lines from the ftrace corresponding to the mmaps
		cat /dev/null > footemp
		for j in `sort mapped_files | uniq`
		do
		    # Merge the readpage(s) traces from the ftrace into strace
		    # for this mmaped file.
		    grep -w $j fstrace.$pid > foobar
		    if [ $? == 0 ]; then
			sort foo.$pid foobar >> footemp
		    fi
		    rm foobar
		done
		rm mapped_files
		if [ -s footemp ]; then
		    mv footemp parsed_input_trace.$pid
		else
		    mv foo.$pid parsed_input_trace.$pid
		fi
	    else
		mv foo.$pid parsed_input_trace.$pid
	    fi
	    rm bar
	else
	    mv foo.$pid parsed_input_trace.$pid
	fi
	echo compiling parsed_input_trace.$pid
	compile_ioshark parsed_input_trace.$pid $pid.wl
	rm parsed_input_trace.$pid
	rm -f foo.$pid
    done
}

# main() starts here

rm -f *.wl
rm -f parsed*
rm -f ioshark_filenames

# Pre-process the ftrace file
prep_fstrace fstrace
# Merge the ftrace file(s) with the strace files
merge_compile

# tar up the .wl files just created
tar cf wl-test.tar ioshark_filenames *.wl
