#!/bin/bash

firstCore=$1
secondCore=$2
maxJobs=$3
runID=$4
tacleNames=tacleNames.txt

if [ $# -lt 4 ]; then
    echo "Usage $0 <first core ID> <second core ID> <number of iterations> <run ID> [TACLe names file]"
    exit
fi

if [ $# -gt 4 ]; then
    echo "Using alternate list of TACLe benchmarks from $5"
    tacleNames=$5
fi

echo "Making sure that binaries are up to date..."
while read i; do
    make bin/$i
done < $tacleNames
echo "Done. Disabling real-time throttling..."

# Turn off rt throttling
echo -1 > /proc/sys/kernel/sched_rt_runtime_us
echo "Done. Redirecting all interrupts to core 0..."

# Redirect all interrupts to core 0
i=0
for IRQ in /proc/irq/*
do
    # Skip default_smp_affinity
    if [ -d $IRQ ]; then
        irqList[$i]=$(cat $IRQ/smp_affinity_list)
        echo 0 > $IRQ/smp_affinity_list
    fi
    i=$(( $i + 1 ))
done
echo "Done. Beginning benchmarks..."

# Read the names of each benchmark
j=0
while read i; do
    tacleProg[$j]=$i
    j=$(( $j + 1 ))
done < $tacleNames


num_tests=$(wc -l < $tacleNames)
for (( i = 0; i < $num_tests ; i++ ))
do
    for (( j = $i; j < $num_tests ; j++ ))  #loop through programs
    do
        chrt -r 97 taskset -c $firstCore ./bin/${tacleProg[$i]} ${tacleProg[$i]} $maxJobs $firstCore $secondCore ${tacleProg[$j]} $runID"-A" 1 & \
        chrt -r 97 taskset -c $secondCore ./bin/${tacleProg[$j]} ${tacleProg[$j]} $maxJobs $secondCore $firstCore ${tacleProg[$i]} $runID"-B" 2 &
        wait
        echo ${tacleProg[$i]} ${tacleProg[$j]}
    done
    echo COMPLETE: ${tacleProg[$i]}
done

# Remove semaphores from system
# Leaving them won't hurt these tests, but would be messy and is bad practice 
# TODO: Do this directly in the benchmarks. They should clean up after themselves
./bin/cleanupSemaphores

# Put smp_affinty back the way it was
i=0
for IRQ in /proc/irq/*
do
    if [ -d $IRQ ]; then
        echo ${irqList[$i]} > $IRQ/smp_affinity_list
    fi
    i=$(( $i + 1 ))
done