#!/bin/bash
# Benchmark a number of kernel builds. Unlike kernbench, multiple kernels are built
# together and can be configured to run over a period of time as a stress test

P='multibuild'
KERNEL_VERSION=3.0
NUM_CPUS=`grep processor /proc/cpuinfo | wc -l`
NUM_COPIES=$((NUM_CPUS*5))
NUM_SIMULTANEOUS=$NUM_CPUS
THREADS=1
. $SHELLPACK_INCLUDE/common.sh

# Basic args parser
while [ "$1" != "" ]; do
	case "$1" in
		-k)
			KERNEL_VERSION=$2
			shift 2;;
		-t)
			THREADS=$2
			shift 2;;
		-s)
			NUM_SIMULTANEOUS=$2
			shift 2;;
		-c)
			NUM_COPIES=$2
			shift 2;;
	esac
done

WEB_LOCATION=http://ftp.kernel.org/pub/linux/kernel/v3.0/linux-$KERNEL_VERSION.tar.gz
MIRROR_LOCATION=$WEBROOT/kernbench/linux-$KERNEL_VERSION.tar.gz

pushd $TESTDISK_DIR > /dev/null
sources_fetch $WEB_LOCATION $MIRROR_LOCATION ./linux-$KERNEL_VERSION.tar.gz

TIME_CMD=`which time`
if [ "$TIME_CMD" = "" ]; then
        TIMEFORMAT="%2Uuser %2Ssystem %Relapsed %P%%CPU"
        TIME_CMD="time"
fi

if [ $NUM_SIMULTANEOUS -gt $NUM_COPIES ]; then
	NUM_SIMULTANEOUS=$NUM_COPIES
fi

echo "Number simultaneous builds: $NUM_SIMULTANEOUS"
echo "Threads per build:          $THREADS"
echo "Total copies:               $NUM_COPIES"
echo
echo -n > build.pids

for IN_PROGRESS in `seq 1 $NUM_SIMULTANEOUS`; do
	echo Pre-expanding instance $IN_PROGRESS
	mkdir $IN_PROGRESS
	tar -C $IN_PROGRESS -xf linux-$KERNEL_VERSION.tar.gz
	if [ ! -e $IN_PROGRESS/linux-$KERNEL_VERSION ]; then
		die Failed to expand tarfile
	fi
done

IN_PROGRESS=1
while [ $IN_PROGRESS -lt $NUM_COPIES ]; do
	NUM_ACTIVE=0
	for PID in `cat build.pids`; do
		if [ "`ps h --pid $PID`" != "" ]; then
			NUM_ACTIVE=$((NUM_ACTIVE+1))
		else
			BUILDPID=`find -maxdepth 3 -name build.$PID`
			if [ "$BUILDPID" != "" ]; then
				BUILDDIR=`dirname $BUILDPID`
				BUILDLOG=$BUILDDIR/`basename $BUILDPID .$PID`.log
				echo o Verifying $BUILDLOG
				TEST=`grep vmlinux $BUILDLOG | grep LD`
				if [ "$TEST" = "" ]; then
					echo o Build instance $BUILDDIR failed
					echo FAILED >> $LOGDIR_RESULTS/failed
					cat $BUILDLOG >> $LOGDIR_RESULTS/failed
					echo ====== >> $LOGDIR_RESULTS/failed
				else
					echo SUCCESS >> $LOGDIR_RESULTS/success
					cat $BUILDLOG >> $LOGDIR_RESULTS/success
					echo ====== >> $LOGDIR_RESULTS/success
				fi
				echo o Cleaning $BUILDDIR
				rm -rf $BUILDDIR
			fi
		fi
	done

	if [ $NUM_ACTIVE -lt $NUM_SIMULTANEOUS ]; then
		echo o Expanding instance $IN_PROGRESS
		if [ ! -e $IN_PROGRESS ]; then
			mkdir $IN_PROGRESS
			tar -C $IN_PROGRESS -xf linux-$KERNEL_VERSION.tar.gz
			if [ ! -e $IN_PROGRESS/linux-$KERNEL_VERSION ]; then
				die Failed to expand tarfile
			fi
		fi
		echo o Building instance $IN_PROGRESS
		cd $IN_PROGRESS/linux-$KERNEL_VERSION || die Failed to enter kernel source
		yes '' | make defconfig > /dev/null 2>&1
		make -j$THREADS clean > /dev/null
		$TIME_CMD make -j$THREADS all 2>> $LOGDIR_RESULTS/time.$IN_PROGRESS > build.log &
		PID=$!
		echo $PID > build.$PID
		cd $TESTDISK_DIR
		echo $PID >> build.pids
		IN_PROGRESS=$((IN_PROGRESS+1))
	fi

	sleep 5
done

# Gather results and cleanup
cat $LOGDIR_RESULTS/time.* | grep elapsed | tee $LOGDIR_RESULTS/time
rm -rf $TESTDISK_DIR/*

exit 0
#### Description Benchmark based on kernel builds
#### Details kernbench-bench 15
