xref: /freebsd-src/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/usdt/tst.reap.ksh (revision 11d38a5764295585a2472d5e861fa8abe1a11eb2)
19f4c7ba4SPedro F. Giffuni#
29f4c7ba4SPedro F. Giffuni# CDDL HEADER START
39f4c7ba4SPedro F. Giffuni#
49f4c7ba4SPedro F. Giffuni# The contents of this file are subject to the terms of the
59f4c7ba4SPedro F. Giffuni# Common Development and Distribution License (the "License").
69f4c7ba4SPedro F. Giffuni# You may not use this file except in compliance with the License.
79f4c7ba4SPedro F. Giffuni#
89f4c7ba4SPedro F. Giffuni# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
99f4c7ba4SPedro F. Giffuni# or http://www.opensolaris.org/os/licensing.
109f4c7ba4SPedro F. Giffuni# See the License for the specific language governing permissions
119f4c7ba4SPedro F. Giffuni# and limitations under the License.
129f4c7ba4SPedro F. Giffuni#
139f4c7ba4SPedro F. Giffuni# When distributing Covered Code, include this CDDL HEADER in each
149f4c7ba4SPedro F. Giffuni# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
159f4c7ba4SPedro F. Giffuni# If applicable, add the following below this CDDL HEADER, with the
169f4c7ba4SPedro F. Giffuni# fields enclosed by brackets "[]" replaced with your own identifying
179f4c7ba4SPedro F. Giffuni# information: Portions Copyright [yyyy] [name of copyright owner]
189f4c7ba4SPedro F. Giffuni#
199f4c7ba4SPedro F. Giffuni# CDDL HEADER END
209f4c7ba4SPedro F. Giffuni#
219f4c7ba4SPedro F. Giffuni
229f4c7ba4SPedro F. Giffuni#
239f4c7ba4SPedro F. Giffuni# Copyright (c) 2011, Joyent, Inc. All rights reserved.
249f4c7ba4SPedro F. Giffuni#
259f4c7ba4SPedro F. Giffuni
269f4c7ba4SPedro F. Giffuniif [ $# != 1 ]; then
279f4c7ba4SPedro F. Giffuni	echo expected one argument: '<'dtrace-path'>'
289f4c7ba4SPedro F. Giffuni	exit 2
299f4c7ba4SPedro F. Giffunifi
309f4c7ba4SPedro F. Giffuni
319f4c7ba4SPedro F. Giffunidtrace=$1
329f4c7ba4SPedro F. GiffuniDIR=/var/tmp/dtest.$$
339f4c7ba4SPedro F. Giffuni
349f4c7ba4SPedro F. Giffunimkdir $DIR
359f4c7ba4SPedro F. Giffunicd $DIR
369f4c7ba4SPedro F. Giffuni
379f4c7ba4SPedro F. Giffunicat > test.c <<EOF
389f4c7ba4SPedro F. Giffuni#include <unistd.h>
399f4c7ba4SPedro F. Giffuni#include <sys/sdt.h>
409f4c7ba4SPedro F. Giffuni
419f4c7ba4SPedro F. Giffuniint
429f4c7ba4SPedro F. Giffunimain(int argc, char **argv)
439f4c7ba4SPedro F. Giffuni{
449f4c7ba4SPedro F. Giffuni	DTRACE_PROBE(test_prov, probe1);
459f4c7ba4SPedro F. Giffuni}
469f4c7ba4SPedro F. GiffuniEOF
479f4c7ba4SPedro F. Giffuni
489f4c7ba4SPedro F. Giffunicat > prov.d <<EOF
499f4c7ba4SPedro F. Giffuniprovider test_prov {
509f4c7ba4SPedro F. Giffuni	probe probe1();
519f4c7ba4SPedro F. Giffuni};
529f4c7ba4SPedro F. GiffuniEOF
539f4c7ba4SPedro F. Giffuni
54d0403385SMark Johnstoncc -c test.c
559f4c7ba4SPedro F. Giffuniif [ $? -ne 0 ]; then
569f4c7ba4SPedro F. Giffuni	print -u2 "failed to compile test.c"
579f4c7ba4SPedro F. Giffuni	exit 1
589f4c7ba4SPedro F. Giffunifi
59*c5af5adaSMark Johnston$dtrace -G -s prov.d test.o
609f4c7ba4SPedro F. Giffuniif [ $? -ne 0 ]; then
619f4c7ba4SPedro F. Giffuni	print -u2 "failed to create DOF"
629f4c7ba4SPedro F. Giffuni	exit 1
639f4c7ba4SPedro F. Giffunifi
64d0403385SMark Johnstoncc -o test test.o prov.o
659f4c7ba4SPedro F. Giffuniif [ $? -ne 0 ]; then
669f4c7ba4SPedro F. Giffuni	print -u2 "failed to link final executable"
679f4c7ba4SPedro F. Giffuni	exit 1
689f4c7ba4SPedro F. Giffunifi
699f4c7ba4SPedro F. Giffuni
709f4c7ba4SPedro F. Giffuniscript()
719f4c7ba4SPedro F. Giffuni{
729f4c7ba4SPedro F. Giffuni	$dtrace -Zwqs /dev/stdin <<EOF
739f4c7ba4SPedro F. Giffuni	test_prov*:::
749f4c7ba4SPedro F. Giffuni	{
759f4c7ba4SPedro F. Giffuni		probeid = id;
769f4c7ba4SPedro F. Giffuni	}
779f4c7ba4SPedro F. Giffuni
789f4c7ba4SPedro F. Giffuni	tick-1sec
799f4c7ba4SPedro F. Giffuni	/probeid == 0/
809f4c7ba4SPedro F. Giffuni	{
819f4c7ba4SPedro F. Giffuni		printf("launching test\n");
829f4c7ba4SPedro F. Giffuni		system("./test");
839f4c7ba4SPedro F. Giffuni	}
849f4c7ba4SPedro F. Giffuni
859f4c7ba4SPedro F. Giffuni	tick-1sec
869f4c7ba4SPedro F. Giffuni	/probeid != 0/
879f4c7ba4SPedro F. Giffuni	{
889f4c7ba4SPedro F. Giffuni		printf("attempting re-enabling\n");
899f4c7ba4SPedro F. Giffuni		system("dtrace -e -x errtags -i %d", probeid);
909f4c7ba4SPedro F. Giffuni		attempts++;
919f4c7ba4SPedro F. Giffuni	}
929f4c7ba4SPedro F. Giffuni
939f4c7ba4SPedro F. Giffuni	tick-1sec
949f4c7ba4SPedro F. Giffuni	/attempts > 10/
959f4c7ba4SPedro F. Giffuni	{
969f4c7ba4SPedro F. Giffuni		exit(0);
979f4c7ba4SPedro F. Giffuni	}
989f4c7ba4SPedro F. GiffuniEOF
999f4c7ba4SPedro F. Giffuni}
1009f4c7ba4SPedro F. Giffuni
1019f4c7ba4SPedro F. Giffuniscript 2>&1 | tee test.out
1029f4c7ba4SPedro F. Giffuni
1039f4c7ba4SPedro F. Giffuni#
1049f4c7ba4SPedro F. Giffuni# It should be true that our probe was reaped over the course of the enabling,
1059f4c7ba4SPedro F. Giffuni# causing the embedded DTrace invocation to fail on an invalid probe (that is,
1069f4c7ba4SPedro F. Giffuni# D_PDESC_INVAL) instead of an inability to grab the underlying process
1079f4c7ba4SPedro F. Giffuni# (D_PROC_GRAB).
1089f4c7ba4SPedro F. Giffuni#
1099f4c7ba4SPedro F. Giffunigrep D_PDESC_INVAL test.out 2> /dev/null 1>&2
1109f4c7ba4SPedro F. Giffunistatus=$?
1119f4c7ba4SPedro F. Giffuni
1129f4c7ba4SPedro F. Giffunicd /
1132c4c1a26SMark Johnstonrm -rf $DIR
1149f4c7ba4SPedro F. Giffuni
1159f4c7ba4SPedro F. Giffuniexit $status
116