#!/bin/sh
##
## Copyright by the Board of Trustees of the University of Illinois.
## All rights reserved.
##
## This file is part of HDF5.  The full HDF5 copyright notice, including
## terms governing use, modification, and redistribution, is contained in
## the files COPYING and Copyright.html.  COPYING can be found at the root
## of the source code distribution tree; Copyright.html can be found at the
## root level of an installed copy of the electronic HDF5 document set and
## is linked from the top-level documents page.  It can also be found at
## http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html.  If you do not have
## access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu.
##
# As a time keeper of the remote daily test process launched by runtest.
# It sleeps for a certain time and then wakes up to hangup those processes
# that are still around, assuming they have run too long.
#
# Programmer: Albert Cheng
# Created Date: 2004/12/23

# variable initialization
waitminutes=300			# default to 5 hours == 300 minutes
debugtimelimit=
debugflag=		# no debug

# Function definitions
#
# PRINTMSG
# Print a one line message left justified in a field of 70 characters
# without newline.  More output for this line later.
#
PRINTMSG() {
    SPACES="                                                               "
    echo "$* $SPACES" | cut -c1-70 | tr -d '\012'
}


USAGE()
{
    echo "Usage: %0 [-h] [-debug] [<time-limit>]"
    echo "    Run timekeeper with <time-limit> minutes, default is $waitminutes."
    echo "    -h      print this help page"
    echo "    -debug  run debug mode"
}


ParseOption()
{
    if [ $# -gt 0 -a "$1" = -h ]; then
	shift
	USAGE
	exit 0
    fi
    if [ $# -gt 0 -a "$1" = -debug ]; then
	shift
	debugflag=yes
	waitminutes=1		# use shorter time for debug
    fi
    if [ $# -gt 0 ]; then
	waitminutes=$1
	shift
    fi
}


# Main body
echo "Timekeeper started at `date`"
ParseOption $*
waitperiod=`expr $waitminutes \* 60`		# convert to seconds

if [ -z "$debugflag" ]; then
    # normal time keeping mode
    # sleep first
    echo Timekeeper sleeping for $waitperiod seconds
    sleep $waitperiod
    # Look for any processes still around
    echo "Timekeeper woke up at `date`, looking for processes to terminate..."
    for x in PID.* ; do
	if [ -f $x ]; then
	    pid=`cat $x`
	    # check if process is still around
	    if ps $pid > /dev/null; then
		echo "terminating process $x ($pid)"
		kill -HUP $pid
	    fi
	fi
    done
else
    # Debug mode. Launch two rsh process, one ends before, the other after
    # waitperiod.  Must launch timekeeper from a subshell, else the debug
    # will wait for it too.
    myhostname=`hostname`
    ( $0 $waitminutes &)
    debugtimelimit=`expr $waitperiod - 10`
    echo rsh $myhostname sleep $debugtimelimit
    rsh $myhostname sleep $debugtimelimit &
    echo $! > PID.before
    debugtimelimit=`expr $waitperiod + 10`
    echo rsh $myhostname sleep $debugtimelimit
    rsh $myhostname sleep $debugtimelimit &
    echo $! > PID.after

    wait
    rm PID.before PID.after
fi

echo "Timekeeper ended at `date`"