1*1449Stomee /*
2*1449Stomee * CDDL HEADER START
3*1449Stomee *
4*1449Stomee * The contents of this file are subject to the terms of the
5*1449Stomee * Common Development and Distribution License (the "License").
6*1449Stomee * You may not use this file except in compliance with the License.
7*1449Stomee *
8*1449Stomee * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*1449Stomee * or http://www.opensolaris.org/os/licensing.
10*1449Stomee * See the License for the specific language governing permissions
11*1449Stomee * and limitations under the License.
12*1449Stomee *
13*1449Stomee * When distributing Covered Code, include this CDDL HEADER in each
14*1449Stomee * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*1449Stomee * If applicable, add the following below this CDDL HEADER, with the
16*1449Stomee * fields enclosed by brackets "[]" replaced with your own identifying
17*1449Stomee * information: Portions Copyright [yyyy] [name of copyright owner]
18*1449Stomee *
19*1449Stomee * CDDL HEADER END
20*1449Stomee */
21*1449Stomee
22*1449Stomee /*
23*1449Stomee * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
24*1449Stomee * Use is subject to license terms.
25*1449Stomee */
26*1449Stomee
27*1449Stomee #pragma ident "%Z%%M% %I% %E% SMI"
28*1449Stomee
29*1449Stomee #include <dtrace_jni.h>
30*1449Stomee
31*1449Stomee /*
32*1449Stomee * This file creates instances of the Java class
33*1449Stomee * org.opensolaris.os.dtrace.InterfaceAttributes.
34*1449Stomee */
35*1449Stomee
36*1449Stomee static const char *
dtj_stability_name(dtrace_stability_t stability)37*1449Stomee dtj_stability_name(dtrace_stability_t stability)
38*1449Stomee {
39*1449Stomee const char *name;
40*1449Stomee switch (stability) {
41*1449Stomee case DTRACE_STABILITY_INTERNAL:
42*1449Stomee name = "INTERNAL";
43*1449Stomee break;
44*1449Stomee case DTRACE_STABILITY_PRIVATE:
45*1449Stomee name = "PRIVATE";
46*1449Stomee break;
47*1449Stomee case DTRACE_STABILITY_OBSOLETE:
48*1449Stomee name = "OBSOLETE";
49*1449Stomee break;
50*1449Stomee case DTRACE_STABILITY_EXTERNAL:
51*1449Stomee name = "EXTERNAL";
52*1449Stomee break;
53*1449Stomee case DTRACE_STABILITY_UNSTABLE:
54*1449Stomee name = "UNSTABLE";
55*1449Stomee break;
56*1449Stomee case DTRACE_STABILITY_EVOLVING:
57*1449Stomee name = "EVOLVING";
58*1449Stomee break;
59*1449Stomee case DTRACE_STABILITY_STABLE:
60*1449Stomee name = "STABLE";
61*1449Stomee break;
62*1449Stomee case DTRACE_STABILITY_STANDARD:
63*1449Stomee name = "STANDARD";
64*1449Stomee break;
65*1449Stomee default:
66*1449Stomee name = NULL;
67*1449Stomee }
68*1449Stomee
69*1449Stomee return (name);
70*1449Stomee }
71*1449Stomee
72*1449Stomee static const char *
dtj_dependency_class_name(dtrace_class_t class)73*1449Stomee dtj_dependency_class_name(dtrace_class_t class)
74*1449Stomee {
75*1449Stomee const char *name;
76*1449Stomee switch (class) {
77*1449Stomee case DTRACE_CLASS_UNKNOWN:
78*1449Stomee name = "UNKNOWN";
79*1449Stomee break;
80*1449Stomee case DTRACE_CLASS_CPU:
81*1449Stomee name = "CPU";
82*1449Stomee break;
83*1449Stomee case DTRACE_CLASS_PLATFORM:
84*1449Stomee name = "PLATFORM";
85*1449Stomee break;
86*1449Stomee case DTRACE_CLASS_GROUP:
87*1449Stomee name = "GROUP";
88*1449Stomee break;
89*1449Stomee case DTRACE_CLASS_ISA:
90*1449Stomee name = "ISA";
91*1449Stomee break;
92*1449Stomee case DTRACE_CLASS_COMMON:
93*1449Stomee name = "COMMON";
94*1449Stomee break;
95*1449Stomee default:
96*1449Stomee name = NULL;
97*1449Stomee }
98*1449Stomee
99*1449Stomee return (name);
100*1449Stomee }
101*1449Stomee
102*1449Stomee jobject
dtj_new_attribute(dtj_java_consumer_t * jc,const dtrace_attribute_t * attr)103*1449Stomee dtj_new_attribute(dtj_java_consumer_t *jc, const dtrace_attribute_t *attr)
104*1449Stomee {
105*1449Stomee JNIEnv *jenv = jc->dtjj_jenv;
106*1449Stomee
107*1449Stomee const char *name;
108*1449Stomee
109*1449Stomee jstring jname = NULL;
110*1449Stomee jobject jattr = NULL; /* return value */
111*1449Stomee
112*1449Stomee jattr = (*jenv)->NewObject(jenv, g_attr_jc, g_attrinit_jm);
113*1449Stomee if ((*jenv)->ExceptionCheck(jenv)) {
114*1449Stomee return (NULL);
115*1449Stomee }
116*1449Stomee
117*1449Stomee /* name stability */
118*1449Stomee name = dtj_stability_name(attr->dtat_name);
119*1449Stomee if (!name) {
120*1449Stomee dtj_throw_illegal_argument(jenv,
121*1449Stomee "unexpected name stability value: %d",
122*1449Stomee attr->dtat_name);
123*1449Stomee (*jenv)->DeleteLocalRef(jenv, jattr);
124*1449Stomee return (NULL);
125*1449Stomee }
126*1449Stomee jname = (*jenv)->NewStringUTF(jenv, name);
127*1449Stomee if ((*jenv)->ExceptionCheck(jenv)) {
128*1449Stomee (*jenv)->DeleteLocalRef(jenv, jattr);
129*1449Stomee return (NULL);
130*1449Stomee }
131*1449Stomee (*jenv)->CallVoidMethod(jenv, jattr, g_attrset_name_jm, jname);
132*1449Stomee (*jenv)->DeleteLocalRef(jenv, jname);
133*1449Stomee if ((*jenv)->ExceptionCheck(jenv)) {
134*1449Stomee (*jenv)->DeleteLocalRef(jenv, jattr);
135*1449Stomee return (NULL);
136*1449Stomee }
137*1449Stomee
138*1449Stomee /* data stability */
139*1449Stomee name = dtj_stability_name(attr->dtat_data);
140*1449Stomee if (!name) {
141*1449Stomee dtj_throw_illegal_argument(jenv,
142*1449Stomee "unexpected data stability value: %d",
143*1449Stomee attr->dtat_data);
144*1449Stomee (*jenv)->DeleteLocalRef(jenv, jattr);
145*1449Stomee return (NULL);
146*1449Stomee }
147*1449Stomee jname = (*jenv)->NewStringUTF(jenv, name);
148*1449Stomee if ((*jenv)->ExceptionCheck(jenv)) {
149*1449Stomee (*jenv)->DeleteLocalRef(jenv, jattr);
150*1449Stomee return (NULL);
151*1449Stomee }
152*1449Stomee (*jenv)->CallVoidMethod(jenv, jattr, g_attrset_data_jm, jname);
153*1449Stomee (*jenv)->DeleteLocalRef(jenv, jname);
154*1449Stomee if ((*jenv)->ExceptionCheck(jenv)) {
155*1449Stomee (*jenv)->DeleteLocalRef(jenv, jattr);
156*1449Stomee return (NULL);
157*1449Stomee }
158*1449Stomee
159*1449Stomee /* dependency class */
160*1449Stomee name = dtj_dependency_class_name(attr->dtat_class);
161*1449Stomee if (!name) {
162*1449Stomee dtj_throw_illegal_argument(jenv,
163*1449Stomee "unexpected dependency class value: %d",
164*1449Stomee attr->dtat_class);
165*1449Stomee (*jenv)->DeleteLocalRef(jenv, jattr);
166*1449Stomee return (NULL);
167*1449Stomee }
168*1449Stomee jname = (*jenv)->NewStringUTF(jenv, name);
169*1449Stomee if ((*jenv)->ExceptionCheck(jenv)) {
170*1449Stomee (*jenv)->DeleteLocalRef(jenv, jattr);
171*1449Stomee return (NULL);
172*1449Stomee }
173*1449Stomee (*jenv)->CallVoidMethod(jenv, jattr, g_attrset_class_jm, jname);
174*1449Stomee (*jenv)->DeleteLocalRef(jenv, jname);
175*1449Stomee if ((*jenv)->ExceptionCheck(jenv)) {
176*1449Stomee (*jenv)->DeleteLocalRef(jenv, jattr);
177*1449Stomee return (NULL);
178*1449Stomee }
179*1449Stomee
180*1449Stomee return (jattr);
181*1449Stomee }
182