blob: d3b0495637329df2218f2342f802ac14ae7127e3 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001#
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
26setup() {
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
54verify_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
99kill_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
151mks_children() {
152 ppid=$1
153 ps -o pid,ppid | grep "${ppid}$" | awk '
154BEGIN { pids="" }
155 { pids = pids $1 " " }
156END { print pids }'
157}
158
159kill_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}