xref: /illumos-gate/usr/src/cmd/dtrace/test/tst/common/java_api/src/TestFunctionLookup.java (revision 4c87aefe8930bd07275b8dd2e96ea5f24d93a52e)
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 2009 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 import org.opensolaris.os.dtrace.*;
28 
29 /**
30  * Regression for bug 6413280 lookupKernelFunction() and
31  * lookupUserFunction() truncate last character.
32  */
33 public class TestFunctionLookup {
34     static final String kernelLookupProgram = "sdt:::callout-start { " +
35            "@[((callout_t *)arg0)->c_func] = count(); }";
36     static final String userLookupProgram = "pid$target::f2:entry { " +
37            "@[arg0] = count(); }";
38 
39     public static void
40     main(String[] args)
41     {
42 	if (args.length != 1) {
43 	    System.err.println("usage: java TestFunctionLookup <command>");
44 	    System.exit(1);
45 	}
46 	String cmd = args[0];
47 
48 	Consumer consumer = new LocalConsumer();
49 	try {
50 	    consumer.open();
51 	    consumer.compile(kernelLookupProgram);
52 	    consumer.enable();
53 	    consumer.go();
54 	    Aggregate a;
55 	    Number address;
56 	    String f;
57 	    boolean done = false;
58 	    for (int i = 0; (i < 20) && !done; ++i) {
59 		Thread.sleep(100);
60 		a = consumer.getAggregate();
61 		for (Aggregation agg : a.getAggregations()) {
62 		    for (Tuple tuple : agg.asMap().keySet()) {
63 			address = (Number)tuple.get(0).getValue();
64 			if (address instanceof Integer) {
65 			    int addr = (Integer)address;
66 			    f = consumer.lookupKernelFunction(addr);
67 			} else {
68 			    long addr = (Long)address;
69 			    f = consumer.lookupKernelFunction(addr);
70 			}
71 			if (f.equals("genunix`cv_wakeup")) {
72 			    System.out.println(f);
73 			    done = true;
74 			}
75 		    }
76 		}
77 	    }
78 	    consumer.close();
79 	} catch (Exception e) {
80 	    e.printStackTrace();
81 	    System.exit(1);
82 	}
83 
84 	consumer = new LocalConsumer();
85 	try {
86 	    consumer.open();
87 	    int pid = consumer.createProcess(cmd);
88 	    consumer.compile(userLookupProgram);
89 	    consumer.enable();
90 	    consumer.go();
91 	    Thread.sleep(500);
92 	    Aggregate a = consumer.getAggregate();
93 	    Number address;
94 	    String f;
95 	    for (Aggregation agg : a.getAggregations()) {
96 		for (Tuple tuple : agg.asMap().keySet()) {
97 		    address = (Number)tuple.get(0).getValue();
98 		    if (address instanceof Integer) {
99 			int addr = (Integer)address;
100 			f = consumer.lookupUserFunction(pid, addr);
101 		    } else {
102 			long addr = (Long)address;
103 			f = consumer.lookupUserFunction(pid, addr);
104 		    }
105 		    System.out.println(f);
106 		}
107 	    }
108 	    consumer.close();
109 	} catch (Exception e) {
110 	    e.printStackTrace();
111 	    System.exit(1);
112 	}
113     }
114 }
115