jdk/test/sun/jvmstat/testlibrary/utils.sh
changeset 2 90ce3da70b43
child 4663 dfea6ffdb0dc
--- /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
+}