--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/jvmstat/testlibrary/utils.sh Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,191 @@
+#
+# Copyright 2004 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+
+#
+
+setup() {
+ # Verify directory context variables are set
+ if [ "${TESTJAVA}" = "" ] ; then
+ echo "TESTJAVA not set. Test cannot execute. Failed."
+ exit 1
+ fi
+
+ if [ "${TESTCLASSES}" = "" ] ; then
+ TESTCLASSES="."
+ fi
+
+ if [ "${TESTSRC}" = "" ] ; then
+ TESTSRC="."
+ fi
+
+ OS=`uname -s`
+ case ${OS} in
+ Windows_*)
+ PS=";"
+ FS="\\"
+ ;;
+ *)
+ PS=":"
+ FS="/"
+ ;;
+ esac
+}
+
+verify_os() {
+ OS=`uname -s`
+ case ${OS} in
+ Windows_95 | Windows_98 | Windows_ME)
+ echo "Test bypassed: jvmstat feature not supported on ${OS}"
+ exit 0
+ ;;
+ Windows_*)
+ # verify that the tmp directory supports persistent ACLs, which
+ # are required for jvmstat to enable its shared memory feature.
+ # NOTE: FAT type files systems do not support ACLs, but NTFS files
+ # systems do.
+ #
+ echo "temp directory is in: `windir -t`"
+ TMPDRIVE=`windir -t | cut -d: -f1`
+ if [ "${TMPDRIVE}" = "" ] ; then
+ echo "Could not get temp directory drive letter"
+ exit 1
+ fi
+
+ echo "temp file system characteristics:"
+ sysinf drives -a | grep "^${TMPDRIVE}"
+ sysinf drives -a | grep "^${TMPDRIVE}" | grep PERSISTENT_ACLS > /dev/null
+ case $? in
+ 0)
+ ;;
+ 1)
+ echo "Test bypassed: jvmstat feature disabled because the temp"
+ echo "directory doesn't support persistent ACLs"
+ exit 0
+ ;;
+ 2)
+ echo "Could not get temp directory file system features"
+ exit 1
+ ;;
+ *)
+ echo "Unexpected return code from grep - $?"
+ exit 1
+ ;;
+ esac
+ ;;
+ esac
+}
+
+# function to kill the process with the given process id
+kill_proc() {
+ kill_pid=$1
+
+ if [ "${kill_pid}" = "" ]
+ then
+ echo "kill_proc(): null pid: ignored"
+ return
+ fi
+
+ if [ ${kill_pid} -le 0 ]
+ then
+ echo "kill_proc(): invalid pid: ${kill_pid}: ignored"
+ return
+ fi
+
+ OS=`uname -s`
+ case $OS in
+ Windows_*)
+ case ${SHELL_VERSION} in
+ [1234567].* | 8.[12345].*)
+ # when starting processes in the background, mks creates an
+ # intervening between the parent process and the background
+ # process. The pid acquired for background process as acquired
+ # by the $! shell variable is actually the pid of the invervening
+ # shell and not that of the background process. Sending a specific
+ # signal to the intervening shell will only effects the intervening
+ # shell and not the background process, thus leaving the background
+ # process running. The following code assumes that the pid passed
+ # into this function as ${kill_pid}, was acquired by $!. Therefore,
+ # in order to kill the background process, we must first find the
+ # children of ${kill_pid} (should be only one child) and kill them.
+
+ ps -o pid,ppid | grep "${kill_pid}$"
+ children=`mks_children ${kill_pid}`
+ echo "killing children of ${kill_pid}: ${children}"
+ for child in ${children} ; do
+ kill_proc_common ${child}
+ done
+ ;;
+ *)
+ # in mks 8.6 and later, the pid returned in $! is now the pid
+ # of the background process and not that of the intervening shell.
+ kill_proc_common ${kill_pid}
+ ;;
+ esac
+ ;;
+ *)
+ kill_proc_common ${kill_pid}
+ ;;
+ esac
+}
+
+mks_children() {
+ ppid=$1
+ ps -o pid,ppid | grep "${ppid}$" | awk '
+BEGIN { pids="" }
+ { pids = pids $1 " " }
+END { print pids }'
+}
+
+kill_proc_common() {
+ kpid=$1
+
+ # verify that the process exists and we can signal it
+ kill -0 ${kpid} 2>/dev/null
+ if [ $? -ne 0 ]
+ then
+ echo "Could not signal >${kpid}<"
+ echo "user id = `id`"
+ echo "process information :"
+ ps -l -p ${kpid}
+ return
+ fi
+
+ kill -TERM ${kpid} # hit it easy first
+ if [ $? -eq 0 ]
+ then
+ sleep 2
+ kill -0 ${kpid} 2>/dev/null
+ # check if it's still hanging around
+ if [ $? -eq 0 ]
+ then
+ # it's still lingering, now it it hard
+ kill -KILL ${kpid} 2>/dev/null
+ if [ $? -ne 0 ]
+ then
+ echo "Could not kill ${kpid}!"
+ fi
+ fi
+ else
+ echo "Error sending term signal to ${kpid}!"
+ fi
+}