xref: /freebsd-src/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/ustack/tst.spin.ksh (revision 2be1a816b9ff69588e55be0a84cbe2a31efc0f2f)
1*2be1a816SJohn Birrell#
2*2be1a816SJohn Birrell# CDDL HEADER START
3*2be1a816SJohn Birrell#
4*2be1a816SJohn Birrell# The contents of this file are subject to the terms of the
5*2be1a816SJohn Birrell# Common Development and Distribution License (the "License").
6*2be1a816SJohn Birrell# You may not use this file except in compliance with the License.
7*2be1a816SJohn Birrell#
8*2be1a816SJohn Birrell# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*2be1a816SJohn Birrell# or http://www.opensolaris.org/os/licensing.
10*2be1a816SJohn Birrell# See the License for the specific language governing permissions
11*2be1a816SJohn Birrell# and limitations under the License.
12*2be1a816SJohn Birrell#
13*2be1a816SJohn Birrell# When distributing Covered Code, include this CDDL HEADER in each
14*2be1a816SJohn Birrell# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*2be1a816SJohn Birrell# If applicable, add the following below this CDDL HEADER, with the
16*2be1a816SJohn Birrell# fields enclosed by brackets "[]" replaced with your own identifying
17*2be1a816SJohn Birrell# information: Portions Copyright [yyyy] [name of copyright owner]
18*2be1a816SJohn Birrell#
19*2be1a816SJohn Birrell# CDDL HEADER END
20*2be1a816SJohn Birrell#
21*2be1a816SJohn Birrell
22*2be1a816SJohn Birrell#
23*2be1a816SJohn Birrell# Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
24*2be1a816SJohn Birrell# Use is subject to license terms.
25*2be1a816SJohn Birrell#
26*2be1a816SJohn Birrell#ident	"%Z%%M%	%I%	%E% SMI"
27*2be1a816SJohn Birrell
28*2be1a816SJohn Birrellif [ $# != 1 ]; then
29*2be1a816SJohn Birrell	echo expected one argument: '<'dtrace-path'>'
30*2be1a816SJohn Birrell	exit 2
31*2be1a816SJohn Birrellfi
32*2be1a816SJohn Birrell
33*2be1a816SJohn Birrellfile=out.$$
34*2be1a816SJohn Birrelldtrace=$1
35*2be1a816SJohn Birrell
36*2be1a816SJohn Birrellrm -f $file
37*2be1a816SJohn Birrell
38*2be1a816SJohn Birrelldir=`dirname $tst`
39*2be1a816SJohn Birrell
40*2be1a816SJohn Birrell$dtrace -o $file -c $dir/tst.spin.exe -s /dev/stdin <<EOF
41*2be1a816SJohn Birrell
42*2be1a816SJohn Birrell	#pragma D option quiet
43*2be1a816SJohn Birrell	#pragma D option destructive
44*2be1a816SJohn Birrell	#pragma D option evaltime=main
45*2be1a816SJohn Birrell
46*2be1a816SJohn Birrell	/*
47*2be1a816SJohn Birrell	 * Toss out the first 100 samples to wait for the program to enter
48*2be1a816SJohn Birrell	 * its steady state.
49*2be1a816SJohn Birrell	 */
50*2be1a816SJohn Birrell
51*2be1a816SJohn Birrell	profile-1999
52*2be1a816SJohn Birrell	/pid == \$target && n++ > 100/
53*2be1a816SJohn Birrell	{
54*2be1a816SJohn Birrell		@total = count();
55*2be1a816SJohn Birrell		@stacks[ustack(4)] = count();
56*2be1a816SJohn Birrell	}
57*2be1a816SJohn Birrell
58*2be1a816SJohn Birrell	tick-1s
59*2be1a816SJohn Birrell	{
60*2be1a816SJohn Birrell		secs++;
61*2be1a816SJohn Birrell	}
62*2be1a816SJohn Birrell
63*2be1a816SJohn Birrell	tick-1s
64*2be1a816SJohn Birrell	/secs > 5/
65*2be1a816SJohn Birrell	{
66*2be1a816SJohn Birrell		done = 1;
67*2be1a816SJohn Birrell	}
68*2be1a816SJohn Birrell
69*2be1a816SJohn Birrell	tick-1s
70*2be1a816SJohn Birrell	/secs > 10/
71*2be1a816SJohn Birrell	{
72*2be1a816SJohn Birrell		trace("test timed out");
73*2be1a816SJohn Birrell		exit(1);
74*2be1a816SJohn Birrell	}
75*2be1a816SJohn Birrell
76*2be1a816SJohn Birrell	profile-1999
77*2be1a816SJohn Birrell	/pid == \$target && done/
78*2be1a816SJohn Birrell	{
79*2be1a816SJohn Birrell		raise(SIGINT);
80*2be1a816SJohn Birrell		exit(0);
81*2be1a816SJohn Birrell	}
82*2be1a816SJohn Birrell
83*2be1a816SJohn Birrell	END
84*2be1a816SJohn Birrell	{
85*2be1a816SJohn Birrell		printa("TOTAL %@u\n", @total);
86*2be1a816SJohn Birrell		printa("START%kEND\n", @stacks);
87*2be1a816SJohn Birrell	}
88*2be1a816SJohn BirrellEOF
89*2be1a816SJohn Birrell
90*2be1a816SJohn Birrellstatus=$?
91*2be1a816SJohn Birrellif [ "$status" -ne 0 ]; then
92*2be1a816SJohn Birrell	echo $tst: dtrace failed
93*2be1a816SJohn Birrell	exit $status
94*2be1a816SJohn Birrellfi
95*2be1a816SJohn Birrell
96*2be1a816SJohn Birrellperl /dev/stdin $file <<EOF
97*2be1a816SJohn Birrell	\$_ = <>;
98*2be1a816SJohn Birrell	chomp;
99*2be1a816SJohn Birrell	die "output problem\n" unless /^TOTAL (\d+)/;
100*2be1a816SJohn Birrell	\$count = \$1;
101*2be1a816SJohn Birrell	die "too few samples (\$count)\n" unless \$count >= 1000;
102*2be1a816SJohn Birrell
103*2be1a816SJohn Birrell	while (<>) {
104*2be1a816SJohn Birrell		chomp;
105*2be1a816SJohn Birrell
106*2be1a816SJohn Birrell		last if /^$/;
107*2be1a816SJohn Birrell
108*2be1a816SJohn Birrell		die "expected START at \$.\n" unless /^START/;
109*2be1a816SJohn Birrell
110*2be1a816SJohn Birrell
111*2be1a816SJohn Birrell		\$_ = <>;
112*2be1a816SJohn Birrell		chomp;
113*2be1a816SJohn Birrell		die "expected END at \$.\n" unless /\`baz\+/;
114*2be1a816SJohn Birrell
115*2be1a816SJohn Birrell		\$_ = <>;
116*2be1a816SJohn Birrell		chomp;
117*2be1a816SJohn Birrell		die "expected END at \$.\n" unless /\`bar\+/;
118*2be1a816SJohn Birrell
119*2be1a816SJohn Birrell		\$_ = <>;
120*2be1a816SJohn Birrell		chomp;
121*2be1a816SJohn Birrell		die "expected END at \$.\n" unless /\`foo\+/;
122*2be1a816SJohn Birrell
123*2be1a816SJohn Birrell		\$_ = <>;
124*2be1a816SJohn Birrell		chomp;
125*2be1a816SJohn Birrell		die "expected END at \$.\n" unless /\`main\+/;
126*2be1a816SJohn Birrell
127*2be1a816SJohn Birrell		\$_ = <>;
128*2be1a816SJohn Birrell		chomp;
129*2be1a816SJohn Birrell		die "expected END at \$.\n" unless /^END\$/;
130*2be1a816SJohn Birrell	}
131*2be1a816SJohn Birrell
132*2be1a816SJohn BirrellEOF
133*2be1a816SJohn Birrell
134*2be1a816SJohn Birrellstatus=$?
135*2be1a816SJohn Birrellif [ "$status" -eq 0 ]; then
136*2be1a816SJohn Birrell	rm -f $file
137*2be1a816SJohn Birrellfi
138*2be1a816SJohn Birrell
139*2be1a816SJohn Birrellexit $status
140