|  | #!/bin/bash | 
|  |  | 
|  | # will run lock_test with whatever arguments are passed in.  default arguments | 
|  | # are -wMAX_VCORES and -l10000. | 
|  |  | 
|  | # TODO: take a param up to MAXVC for how many cores we preempt per loop | 
|  | # TODO: make a program that does the preemption, instead of the script.  it | 
|  | # takes around 2ms to spawn, run, and wait on a program, which messes with the | 
|  | # timing.  When we do this, pull in the vcore shuffling code from prov.c and | 
|  | # have that be an option. | 
|  | # TODO: have better options for the two preempt styles (periodic, vs total) | 
|  | # | 
|  | # Run this from looper.sh for multiple runs. | 
|  |  | 
|  | if [[ $# -lt 2 ]] | 
|  | then | 
|  | echo Usage: $0 PREEMPT_DELAY_USEC ARGS_FOR_LOCK_TEST | 
|  | exit | 
|  | fi | 
|  |  | 
|  | PREEMPT_DELAY=$1 | 
|  |  | 
|  | shift | 
|  |  | 
|  | # for suppressing output later (no /dev/null, and also append doesn't work) | 
|  | echo "" >> tmpfile | 
|  |  | 
|  | # retval of max_vcores is the value | 
|  | max_vcores | 
|  | MAXVC=$? | 
|  | # pth_test exists to hog the machine | 
|  | pthread_test 100 999999999 $MAXVC >> tmpfile 2>&1 & | 
|  | PTHPID=$! | 
|  | echo Launch pth_test, pid was $PTHPID | 
|  |  | 
|  | # if arguments, like -w are repeated, the second one is used | 
|  | lock_test -w $MAXVC -l 10000 $@ & | 
|  | LOCKPID=$! | 
|  | echo Launch lock_test, pid was $LOCKPID | 
|  |  | 
|  | # while lock_test is still alive, we preempt every so often, then give it back. | 
|  | # using the retval of prov -p$LOCKPID to tell us if lock_test is around | 
|  | RET=0 | 
|  | INC=0 | 
|  |  | 
|  | # This is the preempt and never return, hoping to catch deadlocks | 
|  | prov -tc -p$LOCKPID -m >> tmpfile 2>&1 | 
|  |  | 
|  | usleep $PREEMPT_DELAY | 
|  |  | 
|  | prov -tc -p$PTHPID -v1 >> tmpfile 2>&1 | 
|  | prov -tc -p$PTHPID -v2 >> tmpfile 2>&1 | 
|  |  | 
|  | # giving it vc3, which it already has.  this is just a test on process existence | 
|  | while [ $RET -eq 0 ]; do | 
|  | prov -tc -p$LOCKPID -v3 >> tmpfile 2>&1 | 
|  | RET=$? | 
|  | usleep $PREEMPT_DELAY | 
|  | done | 
|  |  | 
|  | ## This is the preempt, return, preempt return cycle | 
|  | #while [ $RET -eq 0 ]; do | 
|  | #	prov -tc -p$LOCKPID -m >> tmpfile 2>&1 | 
|  | #	RET=$? | 
|  | # | 
|  | #	usleep $PREEMPT_DELAY | 
|  | # | 
|  | #	prov -tc -p$PTHPID -v1 >> tmpfile 2>&1 | 
|  | #	prov -tc -p$PTHPID -v2 >> tmpfile 2>&1 | 
|  | # | 
|  | #	# the extra preempts here are to make us wait longer, to see gaps where | 
|  | #	# we "locked up" more clearly. | 
|  | #	usleep $PREEMPT_DELAY | 
|  | #	usleep $PREEMPT_DELAY | 
|  | #	usleep $PREEMPT_DELAY | 
|  | #	usleep $PREEMPT_DELAY | 
|  | #	usleep $PREEMPT_DELAY | 
|  | # | 
|  | #	let INC=$INC+1 | 
|  | #done | 
|  |  | 
|  | ## This is the 'run for a bit, preempt a lot just once, then return all style | 
|  | #prov -tc -p$LOCKPID -m >> tmpfile 2>&1 | 
|  | #usleep $PREEMPT_DELAY | 
|  | #prov -tc -p$PTHPID -v1 >> tmpfile 2>&1 | 
|  | #prov -tc -p$PTHPID -v2 >> tmpfile 2>&1 | 
|  | #prov -tc -p$PTHPID -v3 >> tmpfile 2>&1 | 
|  | #prov -tc -p$PTHPID -v4 >> tmpfile 2>&1 | 
|  | #prov -tc -p$PTHPID -v5 >> tmpfile 2>&1 | 
|  | #prov -tc -p$PTHPID -v6 >> tmpfile 2>&1 | 
|  | #prov -tc -p$PTHPID -v7 >> tmpfile 2>&1 | 
|  | #prov -tc -p$PTHPID -v8 >> tmpfile 2>&1 | 
|  | #prov -tc -p$PTHPID -v9 >> tmpfile 2>&1 | 
|  | #usleep $PREEMPT_DELAY | 
|  | #prov -tc -p$LOCKPID -m >> tmpfile 2>&1 | 
|  | # | 
|  | #while [ $RET -eq 0 ]; do | 
|  | #	prov -tc -p$LOCKPID -m >> tmpfile 2>&1 | 
|  | #	RET=$? | 
|  | #	usleep $PREEMPT_DELAY | 
|  | #done | 
|  |  | 
|  | echo All done, killing pth_test.  Did $INC prov-preempt loops. | 
|  | kill -9 $PTHPID |