Home | History | Annotate | Download | only in pid
      1  5984  jhaslam #!/bin/ksh -p
      2  5984  jhaslam #
      3  5984  jhaslam # CDDL HEADER START
      4  5984  jhaslam #
      5  5984  jhaslam # The contents of this file are subject to the terms of the
      6  5984  jhaslam # Common Development and Distribution License (the "License").
      7  5984  jhaslam # You may not use this file except in compliance with the License.
      8  5984  jhaslam #
      9  5984  jhaslam # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
     10  5984  jhaslam # or http://www.opensolaris.org/os/licensing.
     11  5984  jhaslam # See the License for the specific language governing permissions
     12  5984  jhaslam # and limitations under the License.
     13  5984  jhaslam #
     14  5984  jhaslam # When distributing Covered Code, include this CDDL HEADER in each
     15  5984  jhaslam # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     16  5984  jhaslam # If applicable, add the following below this CDDL HEADER, with the
     17  5984  jhaslam # fields enclosed by brackets "[]" replaced with your own identifying
     18  5984  jhaslam # information: Portions Copyright [yyyy] [name of copyright owner]
     19  5984  jhaslam #
     20  5984  jhaslam # CDDL HEADER END
     21  5984  jhaslam #
     22  5984  jhaslam 
     23  5984  jhaslam #
     24  5984  jhaslam # Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     25  5984  jhaslam # Use is subject to license terms.
     26  5984  jhaslam #
     27  5984  jhaslam # ident	"%Z%%M%	%I%	%E% SMI"
     28  5984  jhaslam 
     29  5984  jhaslam #
     30  5984  jhaslam # This test verifies that USDT probes will be picked up after a dlopen(3C)
     31  5984  jhaslam # when a regex in the provider name matches both USDT probes and pid probes
     32  5984  jhaslam # (e.g., p*d$target matches both pid$target and pyramid$target.)
     33  5984  jhaslam #
     34  5984  jhaslam 
     35  5984  jhaslam if [ $# != 1 ]; then
     36  5984  jhaslam 	echo expected one argument: '<'dtrace-path'>'
     37  5984  jhaslam 	exit 2
     38  5984  jhaslam fi
     39  5984  jhaslam 
     40  5984  jhaslam dtrace=$1
     41  5984  jhaslam DIR=${TMPDIR:-/tmp}/dtest.$$
     42  5984  jhaslam 
     43  5984  jhaslam mkdir $DIR
     44  5984  jhaslam cd $DIR
     45  5984  jhaslam 
     46  5984  jhaslam cat > Makefile <<EOF
     47  5984  jhaslam all: main altlib.so
     48  5984  jhaslam 
     49  5984  jhaslam main: main.o provmain.o
     50  5984  jhaslam 	cc -o main main.o provmain.o
     51  5984  jhaslam 
     52  5984  jhaslam main.o: main.c prov.h
     53  5984  jhaslam 	cc -c main.c
     54  5984  jhaslam 
     55  5984  jhaslam prov.h: prov.d
     56  5984  jhaslam 	$dtrace -h -s prov.d
     57  5984  jhaslam 
     58  5984  jhaslam provmain.o: prov.d main.o
     59  5984  jhaslam 	$dtrace -G -32 -o provmain.o -s prov.d main.o
     60  5984  jhaslam 
     61  5984  jhaslam altlib.so: altlib.o provalt.o
     62  5984  jhaslam 	cc -z defs -G -o altlib.so altlib.o provalt.o -lc
     63  5984  jhaslam 
     64  5984  jhaslam altlib.o: altlib.c prov.h
     65  5984  jhaslam 	cc -c altlib.c
     66  5984  jhaslam 
     67  5984  jhaslam provalt.o: prov.d altlib.o
     68  5984  jhaslam 	$dtrace -G -32 -o provalt.o -s prov.d altlib.o
     69  5984  jhaslam EOF
     70  5984  jhaslam 
     71  5984  jhaslam cat > prov.d <<EOF
     72  5984  jhaslam provider pyramid {
     73  5984  jhaslam 	probe entry();
     74  5984  jhaslam };
     75  5984  jhaslam EOF
     76  5984  jhaslam 
     77  5984  jhaslam cat > altlib.c <<EOF
     78  5984  jhaslam #include <sys/sdt.h>
     79  5984  jhaslam #include "prov.h"
     80  5984  jhaslam 
     81  5984  jhaslam void
     82  5984  jhaslam go(void)
     83  5984  jhaslam {
     84  5984  jhaslam 	PYRAMID_ENTRY();
     85  5984  jhaslam }
     86  5984  jhaslam EOF
     87  5984  jhaslam 
     88  5984  jhaslam cat > main.c <<EOF
     89  5984  jhaslam #include <dlfcn.h>
     90  5984  jhaslam #include <unistd.h>
     91  5984  jhaslam #include <stdio.h>
     92  5984  jhaslam #include <sys/sdt.h>
     93  5984  jhaslam #include "prov.h"
     94  5984  jhaslam 
     95  5984  jhaslam void
     96  5984  jhaslam go(void)
     97  5984  jhaslam {
     98  5984  jhaslam 	PYRAMID_ENTRY();
     99  5984  jhaslam }
    100  5984  jhaslam 
    101  5984  jhaslam int
    102  5984  jhaslam main(int argc, char **argv)
    103  5984  jhaslam {
    104  5984  jhaslam 	void *alt;
    105  5984  jhaslam 	void *alt_go;
    106  5984  jhaslam 
    107  5984  jhaslam 	go();
    108  5984  jhaslam 
    109  5984  jhaslam 	if ((alt = dlopen("./altlib.so", RTLD_LAZY | RTLD_LOCAL)) 
    110  5984  jhaslam 	    == NULL) {
    111  5984  jhaslam 		printf("dlopen of altlib.so failed: %s\n", dlerror());
    112  5984  jhaslam 		return (1);
    113  5984  jhaslam 	}
    114  5984  jhaslam 
    115  5984  jhaslam 	if ((alt_go = dlsym(alt, "go")) == NULL) {
    116  5984  jhaslam 		printf("failed to lookup 'go' in altlib.so\n");
    117  5984  jhaslam 		return (1);
    118  5984  jhaslam 	}
    119  5984  jhaslam 
    120  5984  jhaslam 	((void (*)(void))alt_go)();
    121  5984  jhaslam 
    122  5984  jhaslam 	return (0);
    123  5984  jhaslam }
    124  5984  jhaslam EOF
    125  5984  jhaslam 
    126  5984  jhaslam make > /dev/null
    127  5984  jhaslam if [ $? -ne 0 ]; then
    128  5984  jhaslam 	print -u2 "failed to build"
    129  5984  jhaslam 	exit 1
    130  5984  jhaslam fi
    131  5984  jhaslam 
    132  5984  jhaslam cat > main.d <<'EOF'
    133  5984  jhaslam p*d$target::go:entry
    134  5984  jhaslam {
    135  5984  jhaslam 	@foo[probemod, probefunc, probename] = count();
    136  5984  jhaslam }
    137  5984  jhaslam 
    138  5984  jhaslam END
    139  5984  jhaslam {
    140  5984  jhaslam 	printa("%s:%s:%s %@u\n",@foo);
    141  5984  jhaslam }
    142  5984  jhaslam EOF
    143  5984  jhaslam 
    144  5984  jhaslam script() {
    145  5984  jhaslam 	$dtrace -q -s ./main.d -c ./main
    146  5984  jhaslam }
    147  5984  jhaslam 
    148  5984  jhaslam script
    149  5984  jhaslam status=$?
    150  5984  jhaslam 
    151  5984  jhaslam cd /tmp
    152  5984  jhaslam /usr/bin/rm -rf $DIR
    153  5984  jhaslam 
    154  5984  jhaslam exit $status
    155