xref: /onnv-gate/usr/src/lib/libdtrace_jni/common/dtj_attr.c (revision 1449:5ac202d7f3a7)
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