142 env, provider, &(jvm_provider->nameAttributes)); |
142 env, provider, &(jvm_provider->nameAttributes)); |
143 readFieldInterfaceAttributes("com/sun/tracing/dtrace/ArgsAttributes", |
143 readFieldInterfaceAttributes("com/sun/tracing/dtrace/ArgsAttributes", |
144 env, provider, &(jvm_provider->argsAttributes)); |
144 env, provider, &(jvm_provider->argsAttributes)); |
145 } |
145 } |
146 |
146 |
147 static void readProviderData( |
147 static int readProviderData( |
148 JNIEnv* env, jobject provider, JVM_DTraceProvider* jvm_provider) { |
148 JNIEnv* env, jobject provider, JVM_DTraceProvider* jvm_provider) { |
149 jmethodID mid; |
149 jmethodID mid; |
150 jobjectArray probes; |
150 jobjectArray probes; |
151 jsize i; |
151 jsize i; |
152 jclass clazz = (*env)->GetObjectClass(env, provider); CHECK |
152 jclass clazz = (*env)->GetObjectClass(env, provider); CHECK_(0) |
153 mid = (*env)->GetMethodID( |
153 mid = (*env)->GetMethodID( |
154 env, clazz, "getProbes", "()[Lsun/tracing/dtrace/DTraceProbe;"); CHECK |
154 env, clazz, "getProbes", "()[Lsun/tracing/dtrace/DTraceProbe;"); CHECK_(0) |
155 probes = (jobjectArray)(*env)->CallObjectMethod( |
155 probes = (jobjectArray)(*env)->CallObjectMethod( |
156 env, provider, mid); CHECK |
156 env, provider, mid); CHECK_(0) |
157 |
157 |
158 // Fill JVM structure, describing provider |
158 // Fill JVM structure, describing provider |
159 jvm_provider->probe_count = (*env)->GetArrayLength(env, probes); CHECK |
159 jvm_provider->probe_count = (*env)->GetArrayLength(env, probes); CHECK_(0) |
160 jvm_provider->probes = (JVM_DTraceProbe*)calloc( |
160 jvm_provider->probes = (JVM_DTraceProbe*)calloc( |
161 jvm_provider->probe_count, sizeof(*jvm_provider->probes)); |
161 jvm_provider->probe_count, sizeof(*jvm_provider->probes)); |
162 mid = (*env)->GetMethodID( |
162 mid = (*env)->GetMethodID( |
163 env, clazz, "getProviderName", "()Ljava/lang/String;"); CHECK |
163 env, clazz, "getProviderName", "()Ljava/lang/String;"); CHECK_(0) |
164 jvm_provider->name = (jstring)(*env)->CallObjectMethod( |
164 jvm_provider->name = (jstring)(*env)->CallObjectMethod( |
165 env, provider, mid); CHECK |
165 env, provider, mid); CHECK_(0) |
166 |
166 |
167 readInterfaceAttributes(env, provider, jvm_provider); CHECK |
167 readInterfaceAttributes(env, provider, jvm_provider); CHECK_(0) |
168 |
168 |
169 for (i = 0; i < jvm_provider->probe_count; ++i) { |
169 for (i = 0; i < jvm_provider->probe_count; ++i) { |
170 jobject probe = (*env)->GetObjectArrayElement(env, probes, i); CHECK |
170 jobject probe = (*env)->GetObjectArrayElement(env, probes, i); CHECK_(0) |
171 readProbeData(env, probe, &jvm_provider->probes[i]); CHECK |
171 readProbeData(env, probe, &jvm_provider->probes[i]); CHECK_(0) |
172 } |
172 } |
|
173 |
|
174 return 1; |
173 } |
175 } |
174 |
176 |
175 /* |
177 /* |
176 * Class: sun_tracing_dtrace_JVM |
178 * Class: sun_tracing_dtrace_JVM |
177 * Method: activate0 |
179 * Method: activate0 |
193 num_providers = (*env)->GetArrayLength(env, providers); CHECK_(0L) |
195 num_providers = (*env)->GetArrayLength(env, providers); CHECK_(0L) |
194 |
196 |
195 jvm_providers = (JVM_DTraceProvider*)calloc( |
197 jvm_providers = (JVM_DTraceProvider*)calloc( |
196 num_providers, sizeof(*jvm_providers)); |
198 num_providers, sizeof(*jvm_providers)); |
197 |
199 |
198 for (i = 0; i < num_providers; ++i) { |
200 int count = 0; |
199 JVM_DTraceProvider* p = &(jvm_providers[i]); |
201 for (; count < num_providers; ++count) { |
|
202 JVM_DTraceProvider* p = &(jvm_providers[count]); |
200 jobject provider = (*env)->GetObjectArrayElement( |
203 jobject provider = (*env)->GetObjectArrayElement( |
201 env, providers, i); |
204 env, providers, count); |
202 readProviderData(env, provider, p); |
205 if ((*env)->ExceptionOccurred(env) || |
203 } |
206 ! readProviderData(env, provider, p)) { |
204 |
207 // got an error, bail out! |
205 handle = jvm_symbols->Activate( |
208 break; |
206 env, JVM_TRACING_DTRACE_VERSION, moduleName, |
209 } |
207 num_providers, jvm_providers); |
210 } |
|
211 |
|
212 if (count == num_providers) { |
|
213 // all providers successfully loaded - get the handle |
|
214 handle = jvm_symbols->Activate( |
|
215 env, JVM_TRACING_DTRACE_VERSION, moduleName, |
|
216 num_providers, jvm_providers); |
|
217 } |
208 |
218 |
209 for (i = 0; i < num_providers; ++i) { |
219 for (i = 0; i < num_providers; ++i) { |
210 JVM_DTraceProvider* p = &(jvm_providers[i]); |
220 JVM_DTraceProvider* p = &(jvm_providers[i]); |
211 free(p->probes); |
221 free(p->probes); |
212 } |
222 } |