#!/bin/bash
#
# android_perf: utility for running perf on an android device
#
# The basic usage sequence is to run...
#  1) perf record [gm/tests/bench] # runs profiler on specified app
#  2) perf report # prints profiler results
#  3) perf clean # cleans the temporary directory used to store results
#

SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
source $SCRIPT_DIR/android_setup.sh
source $SCRIPT_DIR/utils/setup_adb.sh

if [ $(uname) == "Linux" ]; then
    PERFHOST=$SCRIPT_DIR/linux/perfhost
elif [ $(uname) == "Darwin" ]; then
    PERFHOST=$SCRIPT_DIR/mac/perfhost
else
    echo "Could not automatically determine OS!"
    exit 1;
fi

# grab and remove the perf command from the input args
PERF_CMD=${APP_ARGS[0]}
unset APP_ARGS[0]
runVars=("${APP_ARGS[@]}")  # shift array indices

# We need the debug symbols from these files
PERF_TMP_DIR=$(pwd)/android_perf_tmp

TMP_SYS_BIN=$PERF_TMP_DIR/system/bin
TMP_SYS_LIB=$PERF_TMP_DIR/system/lib
TMP_APP_LOC=$PERF_TMP_DIR/data/local/tmp

perf_setup() {

    mkdir -p $TMP_SYS_BIN
    mkdir -p $TMP_SYS_LIB
    mkdir -p $TMP_APP_LOC

    echo "Copying symbol files"
    adb_pull_if_needed /system/lib/libc.so $TMP_SYS_LIB
    adb_pull_if_needed /system/lib/libstlport.so $TMP_SYS_LIB
    adb_pull_if_needed /system/lib/libGLESv2.so $TMP_SYS_LIB
    adb_pull_if_needed /system/lib/libandroid.so $TMP_SYS_LIB
    adb_pull_if_needed /system/lib/libm.so $TMP_SYS_LIB
    adb_pull_if_needed /system/lib/libz.so $TMP_SYS_LIB

    # BUILDTYPE variable is set by android_setup.sh
    BUILDDIR="${SKIA_OUT}/${BUILDTYPE}"
    if [ ! -f "${BUILDDIR}/lib/lib${runVars[0]}.so" ];
    then
      echo "Unable to find the ${runVars[0]} library in ${BUILDDIR}/lib."
      exit 1
    fi

    echo "Pushing app..."
    for lib_file in \
        "${BUILDDIR}/skia_launcher" \
        "${BUILDDIR}/lib/libskia_android.so" \
        "${BUILDDIR}/lib/lib${runVars[0]}.so" \
      ; do
      adb_push_if_needed "$lib_file" /data/local/tmp
      cp "$lib_file" $TMP_APP_LOC
    done
}

perf_record() {

    echo "Killing any running Skia processes."
    $ADB shell ps | grep skia_launcher | awk '{print $2}' | xargs $ADB shell kill

    echo "Starting application"
    $ADB shell /data/local/tmp/skia_launcher ${runVars[@]} &

    # WE REALLY REALLY WANT TO BE ABLE TO PASS THE SKIA_LAUNCHER APP DIRECTLY TO
    # PERF, BUT AT THIS POINT THE DATA FILE WE GET WHEN GOING THAT ROUTE IS UNABLE
    # TO BE READ BY THE REPORTING TOOL
    echo "Starting profiler"
    APP_PID=$($ADB shell ps | grep skia_launcher | awk '{print $2}')
    $ADB shell perf record -p ${APP_PID} sleep 70

    $ADB pull /data/perf.data $PERF_TMP_DIR/perf.data

    exit 0;
}

perf_report() {
    adb_pull_if_needed /data/perf.data $PERF_TMP_DIR/perf.data
    $PERFHOST report -i $PERF_TMP_DIR/perf.data --symfs=$PERF_TMP_DIR ${runVars[@]}
}

# Clean up
perf_clean() {
    rm -rf $PERF_TMP_DIR
}

case $PERF_CMD in
  setup)
      perf_setup ${runVars[@]}
      ;;
  record)
      perf_setup ${runVars[@]}
      perf_record ${runVars[@]}
      ;;
  report)
      perf_report
      ;;
  clean)
      perf_clean
      ;;
    *)
      echo -n "ERROR: unknown perf command ($PERF_CMD), valid values: "
      echo "setup, record, report, clean"
      exit 1;
      ;;
esac

exit 0;
