15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/bin/sh 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) 2005, Google Inc. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# All rights reserved. 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Redistribution and use in source and binary forms, with or without 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# modification, are permitted provided that the following conditions are 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# met: 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# * Redistributions of source code must retain the above copyright 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# notice, this list of conditions and the following disclaimer. 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# * Redistributions in binary form must reproduce the above 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# copyright notice, this list of conditions and the following disclaimer 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# in the documentation and/or other materials provided with the 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# distribution. 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# * Neither the name of Google Inc. nor the names of its 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# contributors may be used to endorse or promote products derived from 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# this software without specific prior written permission. 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# --- 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Author: Craig Silverstein 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Runs the 4 profiler unittests and makes sure their profiles look 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# appropriate. We expect two commandline args, as described below. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# We run under the assumption that if $PROFILER1 is run with no 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# arguments, it prints a usage line of the form 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# USAGE: <actual executable being run> [...] 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# This is because libtool sometimes turns the 'executable' into a 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# shell script which runs an actual binary somewhere else. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# We expect BINDIR and PPROF_PATH to be set in the environment. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# If not, we set them to some reasonable values 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BINDIR="${BINDIR:-.}" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPROF_PATH="${PPROF_PATH:-$BINDIR/src/pprof}" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ "x$1" = "x-h" -o "x$1" = "x--help" ]; then 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "USAGE: $0 [unittest dir] [path to pprof]" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo " By default, unittest_dir=$BINDIR, pprof_path=$PPROF_PATH" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit 1 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TMPDIR=/tmp/profile_info 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UNITTEST_DIR=${1:-$BINDIR} 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPROF=${2:-$PPROF_PATH} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# We test the sliding-window functionality of the cpu-profile reader 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# by using a small stride, forcing lots of reads. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPROF_FLAGS="--test_stride=128" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PROFILER1="$UNITTEST_DIR/profiler1_unittest" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PROFILER2="$UNITTEST_DIR/profiler2_unittest" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PROFILER3="$UNITTEST_DIR/profiler3_unittest" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PROFILER4="$UNITTEST_DIR/profiler4_unittest" 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Unfortunately, for us, libtool can replace executables with a shell 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# script that does some work before calling the 'real' executable 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# under a different name. We need the 'real' executable name to run 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# pprof on it. We've constructed all the binaries used in this 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# unittest so when they are called with no arguments, they report 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# their argv[0], which is the real binary name. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Realname() { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$1" 2>&1 | awk '{print $2; exit;}' 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PROFILER1_REALNAME=`Realname "$PROFILER1"` 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PROFILER2_REALNAME=`Realname "$PROFILER2"` 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PROFILER3_REALNAME=`Realname "$PROFILER3"` 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PROFILER4_REALNAME=`Realname "$PROFILER4"` 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# It's meaningful to the profiler, so make sure we know its state 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)unset CPUPROFILE 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)rm -rf "$TMPDIR" 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)mkdir "$TMPDIR" || exit 2 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)num_failures=0 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RegisterFailure() { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_failures=`expr $num_failures + 1` 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Takes two filenames representing profiles, with their executable scripts, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# and a multiplier, and verifies that the 'contentful' functions in 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# each profile take the same time (possibly scaled by the given 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# multiplier). It used to be "same" meant within 50%, after adding an 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# noise-reducing X units to each value. But even that would often 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# spuriously fail, so now it's "both non-zero". We're pretty forgiving. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VerifySimilar() { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prof1="$TMPDIR/$1" 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exec1="$2" 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prof2="$TMPDIR/$3" 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exec2="$4" 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mult="$5" 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # We are careful not to put exec1 and exec2 in quotes, because if 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # they are the empty string, it means we want to use the 1-arg 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # version of pprof. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mthread1=`"$PPROF" $PPROF_FLAGS $exec1 "$prof1" | grep test_main_thread | awk '{print $1}'` 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mthread2=`"$PPROF" $PPROF_FLAGS $exec2 "$prof2" | grep test_main_thread | awk '{print $1}'` 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mthread1_plus=`expr $mthread1 + 5` 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mthread2_plus=`expr $mthread2 + 5` 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ -z "$mthread1" ] || [ -z "$mthread2" ] || \ 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [ "$mthread1" -le 0 -o "$mthread2" -le 0 ] 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# || [ `expr $mthread1_plus \* $mult` -gt `expr $mthread2_plus \* 2` -o \ 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# `expr $mthread1_plus \* $mult \* 2` -lt `expr $mthread2_plus` ] 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) then 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo ">>> profile on $exec1 vs $exec2 with multiplier $mult failed:" 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "Actual times (in profiling units) were '$mthread1' vs. '$mthread2'" 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterFailure 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Takes two filenames representing profiles, and optionally their 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# executable scripts (these may be empty if the profiles include 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# symbols), and verifies that the two profiles are identical. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VerifyIdentical() { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prof1="$TMPDIR/$1" 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exec1="$2" 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prof2="$TMPDIR/$3" 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exec2="$4" 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # We are careful not to put exec1 and exec2 in quotes, because if 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # they are the empty string, it means we want to use the 1-arg 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # version of pprof. 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$PPROF" $PPROF_FLAGS $exec1 "$prof1" > "$TMPDIR/out1" 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$PPROF" $PPROF_FLAGS $exec2 "$prof2" > "$TMPDIR/out2" 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) diff=`diff "$TMPDIR/out1" "$TMPDIR/out2"` 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ ! -z "$diff" ]; then 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo ">>> profile doesn't match, args: $exec1 $prof1 vs. $exec2 $prof2" 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo ">>> Diff:" 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "$diff" 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterFailure 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Takes a filename representing a profile, with its executable, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# and a multiplier, and verifies that the main-thread function takes 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# the same amount of time as the other-threads function (possibly scaled 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# by the given multiplier). Figuring out the multiplier can be tricky, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# since by design the main thread runs twice as long as each of the 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 'other' threads! It used to be "same" meant within 50%, after adding an 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# noise-reducing X units to each value. But even that would often 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# spuriously fail, so now it's "both non-zero". We're pretty forgiving. 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VerifyAcrossThreads() { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prof1="$TMPDIR/$1" 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # We need to run the script with no args to get the actual exe name 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exec1="$2" 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mult="$3" 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # We are careful not to put exec1 in quotes, because if it is the 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # empty string, it means we want to use the 1-arg version of pprof. 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mthread=`$PPROF $PPROF_FLAGS $exec1 "$prof1" | grep test_main_thread | awk '{print $1}'` 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) othread=`$PPROF $PPROF_FLAGS $exec1 "$prof1" | grep test_other_thread | awk '{print $1}'` 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ -z "$mthread" ] || [ -z "$othread" ] || \ 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [ "$mthread" -le 0 -o "$othread" -le 0 ] 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# || [ `expr $mthread \* $mult \* 3` -gt `expr $othread \* 10` -o \ 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# `expr $mthread \* $mult \* 10` -lt `expr $othread \* 3` ] 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) then 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo ">>> profile on $exec1 (main vs thread) with multiplier $mult failed:" 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "Actual times (in profiling units) were '$mthread' vs. '$othread'" 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterFailure 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo ">>> WARNING <<<" 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo "This test looks at timing information to determine correctness." 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo "If your system is loaded, the test may spuriously fail." 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo "If the test does fail with an 'Actual times' error, try running again." 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# profiler1 is a non-threaded version 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"$PROFILER1" 50 1 "$TMPDIR/p1" || RegisterFailure 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"$PROFILER1" 100 1 "$TMPDIR/p2" || RegisterFailure 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VerifySimilar p1 "$PROFILER1_REALNAME" p2 "$PROFILER1_REALNAME" 2 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Verify the same thing works if we statically link 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"$PROFILER2" 50 1 "$TMPDIR/p3" || RegisterFailure 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"$PROFILER2" 100 1 "$TMPDIR/p4" || RegisterFailure 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VerifySimilar p3 "$PROFILER2_REALNAME" p4 "$PROFILER2_REALNAME" 2 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Verify the same thing works if we specify via CPUPROFILE 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CPUPROFILE="$TMPDIR/p5" "$PROFILER2" 50 || RegisterFailure 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CPUPROFILE="$TMPDIR/p6" "$PROFILER2" 100 || RegisterFailure 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VerifySimilar p5 "$PROFILER2_REALNAME" p6 "$PROFILER2_REALNAME" 2 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CPUPROFILE="$TMPDIR/p5b" "$PROFILER3" 30 || RegisterFailure 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CPUPROFILE="$TMPDIR/p5c" "$PROFILER3" 60 || RegisterFailure 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VerifySimilar p5b "$PROFILER3_REALNAME" p5c "$PROFILER3_REALNAME" 2 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Now try what happens when we use threads 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"$PROFILER3" 30 2 "$TMPDIR/p7" || RegisterFailure 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"$PROFILER3" 60 2 "$TMPDIR/p8" || RegisterFailure 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VerifySimilar p7 "$PROFILER3_REALNAME" p8 "$PROFILER3_REALNAME" 2 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"$PROFILER4" 30 2 "$TMPDIR/p9" || RegisterFailure 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"$PROFILER4" 60 2 "$TMPDIR/p10" || RegisterFailure 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VerifySimilar p9 "$PROFILER4_REALNAME" p10 "$PROFILER4_REALNAME" 2 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# More threads! 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"$PROFILER4" 25 3 "$TMPDIR/p9" || RegisterFailure 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"$PROFILER4" 50 3 "$TMPDIR/p10" || RegisterFailure 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VerifySimilar p9 "$PROFILER4_REALNAME" p10 "$PROFILER4_REALNAME" 2 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Compare how much time the main thread takes compared to the other threads 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Recall the main thread runs twice as long as the other threads, by design. 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"$PROFILER4" 20 4 "$TMPDIR/p11" || RegisterFailure 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VerifyAcrossThreads p11 "$PROFILER4_REALNAME" 2 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Test symbol save and restore 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"$PROFILER1" 50 1 "$TMPDIR/p12" || RegisterFailure 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"$PPROF" $PPROF_FLAGS "$PROFILER1_REALNAME" "$TMPDIR/p12" --raw \ 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) >"$TMPDIR/p13" 2>/dev/null || RegisterFailure 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VerifyIdentical p12 "$PROFILER1_REALNAME" p13 "" || RegisterFailure 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"$PROFILER3" 30 2 "$TMPDIR/p14" || RegisterFailure 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"$PPROF" $PPROF_FLAGS "$PROFILER3_REALNAME" "$TMPDIR/p14" --raw \ 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) >"$TMPDIR/p15" 2>/dev/null || RegisterFailure 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VerifyIdentical p14 "$PROFILER3_REALNAME" p15 "" || RegisterFailure 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Test using ITIMER_REAL instead of ITIMER_PROF. 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)env CPUPROFILE_REALTIME=1 "$PROFILER3" 30 2 "$TMPDIR/p16" || RegisterFailure 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)env CPUPROFILE_REALTIME=1 "$PROFILER3" 60 2 "$TMPDIR/p17" || RegisterFailure 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VerifySimilar p16 "$PROFILER3_REALNAME" p17 "$PROFILER3_REALNAME" 2 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Make sure that when we have a process with a fork, the profiles don't 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# clobber each other 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CPUPROFILE="$TMPDIR/pfork" "$PROFILER1" 1 -2 || RegisterFailure 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)n=`ls $TMPDIR/pfork* | wc -l` 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ $n != 3 ]; then 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "FORK test FAILED: expected 3 profiles (for main + 2 children), found $n" 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_failures=`expr $num_failures + 1` 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)rm -rf "$TMPDIR" # clean up 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo "Tests finished with $num_failures failures" 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit $num_failures 262