1 #
   2 # Copyright 2004 Sun Microsystems, Inc.  All Rights Reserved.
   3 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4 #
   5 # This code is free software; you can redistribute it and/or modify it
   6 # under the terms of the GNU General Public License version 2 only, as
   7 # published by the Free Software Foundation.
   8 #
   9 # This code is distributed in the hope that it will be useful, but WITHOUT
  10 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11 # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12 # version 2 for more details (a copy is included in the LICENSE file that
  13 # accompanied this code).
  14 #
  15 # You should have received a copy of the GNU General Public License version
  16 # 2 along with this work; if not, write to the Free Software Foundation,
  17 # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18 #
  19 # Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  20 # CA 95054 USA or visit www.sun.com if you need additional information or
  21 # have any questions.
  22 #
  23 
  24 #
  25 
  26 setup() {
  27     # Verify directory context variables are set
  28     if [ "${TESTJAVA}" = "" ] ; then
  29         echo "TESTJAVA not set. Test cannot execute.  Failed."
  30         exit 1
  31     fi
  32 
  33     if [ "${TESTCLASSES}" = "" ] ; then
  34         TESTCLASSES="."
  35     fi
  36 
  37     if [ "${TESTSRC}" = "" ] ; then
  38         TESTSRC="."
  39     fi
  40 
  41     OS=`uname -s`
  42     case ${OS} in
  43     Windows_*)
  44         PS=";"
  45         FS="\\"
  46         ;;
  47     *)
  48         PS=":"
  49         FS="/"
  50         ;;
  51     esac
  52 }
  53 
  54 verify_os() {
  55     OS=`uname -s`
  56     case ${OS} in
  57     Windows_95 | Windows_98 | Windows_ME)
  58         echo "Test bypassed: jvmstat feature not supported on ${OS}"
  59         exit 0
  60         ;;
  61     Windows_*)
  62         # verify that the tmp directory supports persistent ACLs, which
  63         # are required for jvmstat to enable its shared memory feature.
  64         # NOTE: FAT type files systems do not support ACLs, but NTFS files
  65         # systems do.
  66         #
  67         echo "temp directory is in: `windir -t`"
  68         TMPDRIVE=`windir -t | cut -d: -f1`
  69         if [ "${TMPDRIVE}" = "" ] ; then
  70             echo "Could not get temp directory drive letter"
  71             exit 1
  72         fi
  73 
  74         echo "temp file system characteristics:"
  75         sysinf drives -a | grep "^${TMPDRIVE}"
  76         sysinf drives -a | grep "^${TMPDRIVE}" | grep PERSISTENT_ACLS > /dev/null
  77         case $? in
  78         0)
  79             ;;
  80         1)
  81             echo "Test bypassed: jvmstat feature disabled because the temp"
  82             echo "directory doesn't support persistent ACLs"
  83             exit 0
  84             ;;
  85         2)
  86             echo "Could not get temp directory file system features"
  87             exit 1
  88             ;;
  89         *)
  90             echo "Unexpected return code from grep - $?"
  91             exit 1
  92             ;;
  93         esac
  94         ;;
  95     esac
  96 }
  97 
  98 # function to kill the process with the given process id
  99 kill_proc() {
 100     kill_pid=$1
 101 
 102     if [ "${kill_pid}" = "" ]
 103     then
 104         echo "kill_proc(): null pid: ignored"
 105         return
 106     fi
 107 
 108     if [ ${kill_pid} -le 0 ]
 109     then
 110         echo "kill_proc(): invalid pid: ${kill_pid}: ignored"
 111         return
 112     fi
 113 
 114     OS=`uname -s`
 115     case $OS in
 116     Windows_*)
 117         case ${SHELL_VERSION} in
 118         [1234567].* | 8.[12345].*)
 119             # when starting processes in the background, mks creates an
 120             # intervening between the parent process and the background
 121             # process. The pid acquired for background process as acquired
 122             # by the $! shell variable is actually the pid of the invervening
 123             # shell and not that of the background process. Sending a specific
 124             # signal to the intervening shell will only effects the intervening 
 125             # shell and not the background process, thus leaving the background
 126             # process running. The following code assumes that the pid passed
 127             # into this function as ${kill_pid}, was acquired by $!. Therefore,
 128             # in order to kill the background process, we must first find the
 129             # children of ${kill_pid} (should be only one child) and kill them.
 130         
 131             ps -o pid,ppid | grep "${kill_pid}$"
 132             children=`mks_children ${kill_pid}`
 133             echo "killing children of ${kill_pid}: ${children}"
 134             for child in ${children} ; do
 135                 kill_proc_common ${child}
 136             done
 137             ;;
 138         *)
 139             # in mks 8.6 and later, the pid returned in $! is now the pid
 140             # of the background process and not that of the intervening shell.
 141             kill_proc_common ${kill_pid}
 142             ;;
 143         esac
 144         ;;
 145     *)
 146         kill_proc_common ${kill_pid}
 147         ;;
 148     esac
 149 }
 150 
 151 mks_children() {
 152     ppid=$1
 153     ps -o pid,ppid | grep "${ppid}$" | awk '
 154 BEGIN   { pids="" }
 155         { pids = pids $1 " " }
 156 END     { print pids }'
 157 }
 158 
 159 kill_proc_common() {
 160    kpid=$1
 161 
 162     # verify that the process exists and we can signal it
 163     kill -0 ${kpid} 2>/dev/null
 164     if [ $? -ne 0 ]
 165     then
 166         echo "Could not signal >${kpid}<"
 167         echo "user id = `id`"
 168         echo "process information :"
 169         ps -l -p ${kpid}
 170         return
 171     fi
 172 
 173     kill -TERM ${kpid}          # hit it easy first
 174     if [ $? -eq 0 ]
 175     then
 176         sleep 2
 177         kill -0 ${kpid} 2>/dev/null
 178         # check if it's still hanging around
 179         if [ $? -eq 0 ]
 180         then
 181             # it's still lingering, now it it hard
 182             kill -KILL ${kpid} 2>/dev/null
 183             if [ $? -ne 0 ]
 184             then
 185                 echo "Could not kill ${kpid}!"
 186             fi
 187         fi
 188     else
 189         echo "Error sending term signal to ${kpid}!"
 190     fi
 191 }