1#
2# CDDL HEADER START
3#
4# The contents of this file are subject to the terms of the
5# Common Development and Distribution License (the "License").
6# You may not use this file except in compliance with the License.
7#
8# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9# or http://www.opensolaris.org/os/licensing.
10# See the License for the specific language governing permissions
11# and limitations under the License.
12#
13# When distributing Covered Code, include this CDDL HEADER in each
14# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15# If applicable, add the following below this CDDL HEADER, with the
16# fields enclosed by brackets "[]" replaced with your own identifying
17# information: Portions Copyright [yyyy] [name of copyright owner]
18#
19# CDDL HEADER END
20#
21
22#
23# Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
24# Use is subject to license terms.
25#
26# ident	"%Z%%M%	%I%	%E% SMI"
27
28unload()
29{
30	#
31	# Get the list of services whose processes have USDT probes.  Ideally
32	# it would be possible to unload the fasttrap provider while USDT
33	# probes exist -- once that fix is integrated, this hack can go away
34	# We create two lists -- one of regular SMF services and one of legacy
35	# services -- since each must be enabled and disabled using a specific
36	# mechanism.
37	#
38	pids=$(dtrace -l | \
39	    perl -ne 'print "$1\n" if (/^\s*\S+\s+\S*\D(\d+)\s+/);' | \
40	    sort | uniq | tr '\n' ',')
41
42	ctids=$(ps -p $pids -o ctid | tail +2 | sort | uniq)
43	svcs=
44	lrcs=
45
46	for ct in $ctids
47	do
48		line=$(svcs -o fmri,ctid | grep " $ct\$")
49		svc=$(echo $line | cut -d' ' -f1)
50
51		if [[ $(svcs -Ho STA $svc) == "LRC" ]]; then
52			lrc=$(svcs -Ho SVC $svc | tr _ '?')
53			lrcs="$lrcs $lrc"
54		else
55			svcs="$svcs $svc"
56	fi
57	done
58
59	for svc in $svcs
60	do
61		svcadm disable -ts $svc
62	done
63
64	for lrc in $lrcs
65	do
66		#
67		# Does it seem a little paternalistic that lsvcrun requires
68		# this environment variable to be set? I'd say so...
69		#
70		SMF_RESTARTER=svc:/system/svc/restarter:default \
71		    /lib/svc/bin/lsvcrun $lrc stop
72	done
73
74	modunload -i 0
75	modunload -i 0
76	modunload -i 0
77	modinfo | grep dtrace
78	success=$?
79
80	for svc in $svcs
81	do
82		svcadm enable -ts $svc
83	done
84
85	for lrc in $lrcs
86	do
87		SMF_RESTARTER=svc:/system/svc/restarter:default \
88		    /lib/svc/bin/lsvcrun $lrc start
89	done
90
91	if [ ! $success ]; then
92		echo $tst: could not unload dtrace
93		exit 1
94	fi
95}
96
97script1()
98{
99	$dtrace -s /dev/stdin <<EOF
100	syscall:::entry
101	/pid != $ppid/
102	{
103		@a[probefunc] = count();
104	}
105
106	tick-1sec
107	/i++ == 5/
108	{
109		exit(0);
110	}
111EOF
112}
113
114script2()
115{
116	$dtrace -s /dev/stdin <<EOF
117
118	#pragma D option statusrate=1ms
119
120	syscall:::entry
121	/pid == $ppid/
122	{
123		ttl++;
124	}
125
126	tick-1sec
127	/i++ == 5/
128	{
129		exit(2);
130	}
131
132	END
133	/ttl/
134	{
135		printf("success; ttl is %d", ttl);
136		exit(0);
137	}
138
139	END
140	/ttl == 0/
141	{
142		printf("error -- total should be non-zero");
143		exit(1);
144	}
145EOF
146}
147
148if [ $# != 1 ]; then
149	echo expected one argument: '<'dtrace-path'>'
150	exit 2
151fi
152
153ppid=$$
154dtrace=$1
155
156unload
157script1 &
158child=$!
159
160let waited=0
161
162while [ "$waited" -lt 5 ]; do
163	seconds=`date +%S`
164
165	if [ "$seconds" -ne "$last" ]; then
166		last=$seconds
167		let waited=waited+1
168	fi
169done
170
171wait $child
172status=$?
173
174if [ "$status" -ne 0 ]; then
175	echo $tst: first dtrace failed
176	exit $status
177fi
178
179unload
180script2 &
181child=$!
182
183let waited=0
184
185while [ "$waited" -lt 10 ]; do
186	seconds=`date +%S`
187
188	if [ "$seconds" -ne "$last" ]; then
189		last=$seconds
190		let waited=waited+1
191	fi
192done
193
194wait $child
195status=$?
196
197exit $status
198