7dea7787e2
Refactor test/sun/tools/common/* code and refactor AnonLoggerWeakRefLeak and LoggerWeakRefLeak to use it. Reviewed-by: ohair, alanb
211 lines
6.1 KiB
Bash
211 lines
6.1 KiB
Bash
#!/bin/sh
|
|
|
|
#
|
|
# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
#
|
|
# This code is free software; you can redistribute it and/or modify it
|
|
# under the terms of the GNU General Public License version 2 only, as
|
|
# published by the Free Software Foundation.
|
|
#
|
|
# This code is distributed in the hope that it will be useful, but WITHOUT
|
|
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
# version 2 for more details (a copy is included in the LICENSE file that
|
|
# accompanied this code).
|
|
#
|
|
# You should have received a copy of the GNU General Public License version
|
|
# 2 along with this work; if not, write to the Free Software Foundation,
|
|
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
#
|
|
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
# or visit www.oracle.com if you need additional information or have any
|
|
# questions.
|
|
#
|
|
|
|
|
|
# Support functions to start, stop, wait for or kill a given SimpleApplication
|
|
|
|
# Starts a given app as background process, usage:
|
|
# startApplication <class> port-file [args...]
|
|
#
|
|
# The following variables are set:
|
|
#
|
|
# appJavaPid - application's Java pid
|
|
# appOtherPid - pid associated with the app other than appJavaPid
|
|
# appPidList - all pids associated with the app
|
|
# appOutput - file containing stdout and stderr from the app
|
|
#
|
|
# Waits for at least one line of output from the app to indicate
|
|
# that it is up and running.
|
|
#
|
|
startApplication()
|
|
{
|
|
appOutput="${TESTCLASSES}/Application.out"
|
|
|
|
${JAVA} -classpath "${TESTCLASSES}" "$@" > "$appOutput" 2>&1 &
|
|
appJavaPid="$!"
|
|
appOtherPid=
|
|
appPidList="$appJavaPid"
|
|
|
|
echo "INFO: waiting for $1 to initialize..."
|
|
_cnt=0
|
|
while true; do
|
|
# if the app doesn't start then the JavaTest/JTREG timeout will
|
|
# kick in so this isn't really a endless loop
|
|
sleep 1
|
|
out=`tail -1 "$appOutput"`
|
|
if [ -n "$out" ]; then
|
|
# we got some output from the app so it's running
|
|
break
|
|
fi
|
|
_cnt=`expr $_cnt + 1`
|
|
echo "INFO: waited $_cnt second(s) ..."
|
|
done
|
|
unset _cnt
|
|
|
|
if $isWindows; then
|
|
# Windows requires special handling
|
|
appOtherPid="$appJavaPid"
|
|
|
|
if $isCygwin; then
|
|
appJavaPid=`ps -p "$appOtherPid" \
|
|
| sed -n '
|
|
# See if $appOtherPid is in PID column; there are sometimes
|
|
# non-blanks in column 1 (I and S observed so far)
|
|
/^.'"${PATTERN_WS}${PATTERN_WS}*${appOtherPid}${PATTERN_WS}"'/{
|
|
# strip PID column
|
|
s/^.'"${PATTERN_WS}${PATTERN_WS}*${appOtherPid}${PATTERN_WS}${PATTERN_WS}"'*//
|
|
# strip PPID column
|
|
s/^[1-9][0-9]*'"${PATTERN_WS}${PATTERN_WS}"'*//
|
|
# strip PGID column
|
|
s/^[1-9][0-9]*'"${PATTERN_WS}${PATTERN_WS}"'*//
|
|
# strip everything after WINPID column
|
|
s/'"${PATTERN_WS}"'.*//
|
|
p
|
|
q
|
|
}
|
|
'`
|
|
echo "INFO: Cygwin pid=$appOtherPid maps to Windows pid=$appJavaPid"
|
|
else
|
|
# show PID, PPID and COMM columns only
|
|
appJavaPid=`ps -o pid,ppid,comm \
|
|
| sed -n '
|
|
# see if appOtherPid is in either PID or PPID columns
|
|
/'"${PATTERN_WS}${appOtherPid}${PATTERN_WS}"'/{
|
|
# see if this is a java command
|
|
/java'"${PATTERN_EOL}"'/{
|
|
# strip leading white space
|
|
s/^'"${PATTERN_WS}${PATTERN_WS}"'*//
|
|
# strip everything after the first word
|
|
s/'"${PATTERN_WS}"'.*//
|
|
# print the pid and we are done
|
|
p
|
|
q
|
|
}
|
|
}
|
|
'`
|
|
echo "INFO: MKS shell pid=$appOtherPid; Java pid=$appJavaPid"
|
|
fi
|
|
|
|
if [ -z "$appJavaPid" ]; then
|
|
echo "ERROR: could not find app's Java pid." >&2
|
|
killApplication
|
|
exit 2
|
|
fi
|
|
appPidList="$appOtherPid $appJavaPid"
|
|
fi
|
|
|
|
echo "INFO: $1 is process $appJavaPid"
|
|
echo "INFO: $1 output is in $appOutput"
|
|
}
|
|
|
|
|
|
# Stops a simple application by invoking ShutdownSimpleApplication
|
|
# class with a specific port-file, usage:
|
|
# stopApplication port-file
|
|
#
|
|
# Note: When this function returns, the SimpleApplication (or a subclass)
|
|
# may still be running because the application has not yet reached the
|
|
# shutdown check.
|
|
#
|
|
stopApplication()
|
|
{
|
|
$JAVA -classpath "${TESTCLASSES}" ShutdownSimpleApplication $1
|
|
}
|
|
|
|
|
|
# Wait for a simple application to stop running.
|
|
#
|
|
waitForApplication() {
|
|
if [ $isWindows = false ]; then
|
|
# non-Windows is easy; just one process
|
|
echo "INFO: waiting for $appJavaPid"
|
|
set +e
|
|
wait "$appJavaPid"
|
|
set -e
|
|
|
|
elif $isCygwin; then
|
|
# Cygwin pid and not the Windows pid
|
|
echo "INFO: waiting for $appOtherPid"
|
|
set +e
|
|
wait "$appOtherPid"
|
|
set -e
|
|
|
|
else # implied isMKS
|
|
# MKS has intermediate shell and Java process
|
|
echo "INFO: waiting for $appJavaPid"
|
|
|
|
# appJavaPid can be empty if pid search in startApplication() failed
|
|
if [ -n "$appJavaPid" ]; then
|
|
# only need to wait for the Java process
|
|
set +e
|
|
wait "$appJavaPid"
|
|
set -e
|
|
fi
|
|
fi
|
|
}
|
|
|
|
|
|
# Kills a simple application by sending a SIGTERM to the appropriate
|
|
# process(es); on Windows SIGQUIT (-9) is used.
|
|
#
|
|
killApplication()
|
|
{
|
|
if [ $isWindows = false ]; then
|
|
# non-Windows is easy; just one process
|
|
echo "INFO: killing $appJavaPid"
|
|
set +e
|
|
kill -TERM "$appJavaPid" # try a polite SIGTERM first
|
|
sleep 2
|
|
# send SIGQUIT (-9) just in case SIGTERM didn't do it
|
|
# but don't show any complaints
|
|
kill -QUIT "$appJavaPid" > /dev/null 2>&1
|
|
wait "$appJavaPid"
|
|
set -e
|
|
|
|
elif $isCygwin; then
|
|
# Cygwin pid and not the Windows pid
|
|
echo "INFO: killing $appOtherPid"
|
|
set +e
|
|
kill -9 "$appOtherPid"
|
|
wait "$appOtherPid"
|
|
set -e
|
|
|
|
else # implied isMKS
|
|
# MKS has intermediate shell and Java process
|
|
echo "INFO: killing $appPidList"
|
|
set +e
|
|
kill -9 $appPidList
|
|
set -e
|
|
|
|
# appJavaPid can be empty if pid search in startApplication() failed
|
|
if [ -n "$appJavaPid" ]; then
|
|
# only need to wait for the Java process
|
|
set +e
|
|
wait "$appJavaPid"
|
|
set -e
|
|
fi
|
|
fi
|
|
}
|