317 // Functions needed by java.lang.instrument for starting up javaagent. |
317 // Functions needed by java.lang.instrument for starting up javaagent. |
318 /////////////////////////////////////////////////////////////// |
318 /////////////////////////////////////////////////////////////// |
319 |
319 |
320 jint |
320 jint |
321 JvmtiExport::get_jvmti_interface(JavaVM *jvm, void **penv, jint version) { |
321 JvmtiExport::get_jvmti_interface(JavaVM *jvm, void **penv, jint version) { |
322 /* To Do: add version checks */ |
322 // The JVMTI_VERSION_INTERFACE_JVMTI part of the version number |
|
323 // has already been validated in JNI GetEnv(). |
|
324 int major, minor, micro; |
|
325 |
|
326 // micro version doesn't matter here (yet?) |
|
327 decode_version_values(version, &major, &minor, µ); |
|
328 switch (major) { |
|
329 case 1: |
|
330 switch (minor) { |
|
331 case 0: // version 1.0.<micro> is recognized |
|
332 case 1: // version 1.1.<micro> is recognized |
|
333 break; |
|
334 |
|
335 default: |
|
336 return JNI_EVERSION; // unsupported minor version number |
|
337 } |
|
338 break; |
|
339 |
|
340 default: |
|
341 return JNI_EVERSION; // unsupported major version number |
|
342 } |
323 |
343 |
324 if (JvmtiEnv::get_phase() == JVMTI_PHASE_LIVE) { |
344 if (JvmtiEnv::get_phase() == JVMTI_PHASE_LIVE) { |
325 JavaThread* current_thread = (JavaThread*) ThreadLocalStorage::thread(); |
345 JavaThread* current_thread = (JavaThread*) ThreadLocalStorage::thread(); |
326 // transition code: native to VM |
346 // transition code: native to VM |
327 ThreadInVMfromNative __tiv(current_thread); |
347 ThreadInVMfromNative __tiv(current_thread); |
328 __ENTRY(jvmtiEnv*, JvmtiExport::get_jvmti_interface, current_thread) |
348 __ENTRY(jvmtiEnv*, JvmtiExport::get_jvmti_interface, current_thread) |
329 debug_only(VMNativeEntryWrapper __vew;) |
349 debug_only(VMNativeEntryWrapper __vew;) |
330 |
350 |
331 JvmtiEnv *jvmti_env = JvmtiEnv::create_a_jvmti(); |
351 JvmtiEnv *jvmti_env = JvmtiEnv::create_a_jvmti(version); |
332 *penv = jvmti_env->jvmti_external(); // actual type is jvmtiEnv* -- not to be confused with JvmtiEnv* |
352 *penv = jvmti_env->jvmti_external(); // actual type is jvmtiEnv* -- not to be confused with JvmtiEnv* |
333 return JNI_OK; |
353 return JNI_OK; |
334 |
354 |
335 } else if (JvmtiEnv::get_phase() == JVMTI_PHASE_ONLOAD) { |
355 } else if (JvmtiEnv::get_phase() == JVMTI_PHASE_ONLOAD) { |
336 // not live, no thread to transition |
356 // not live, no thread to transition |
337 JvmtiEnv *jvmti_env = JvmtiEnv::create_a_jvmti(); |
357 JvmtiEnv *jvmti_env = JvmtiEnv::create_a_jvmti(version); |
338 *penv = jvmti_env->jvmti_external(); // actual type is jvmtiEnv* -- not to be confused with JvmtiEnv* |
358 *penv = jvmti_env->jvmti_external(); // actual type is jvmtiEnv* -- not to be confused with JvmtiEnv* |
339 return JNI_OK; |
359 return JNI_OK; |
340 |
360 |
341 } else { |
361 } else { |
342 // Called at the wrong time |
362 // Called at the wrong time |
343 *penv = NULL; |
363 *penv = NULL; |
344 return JNI_EDETACHED; |
364 return JNI_EDETACHED; |
345 } |
365 } |
|
366 } |
|
367 |
|
368 |
|
369 void |
|
370 JvmtiExport::decode_version_values(jint version, int * major, int * minor, |
|
371 int * micro) { |
|
372 *major = (version & JVMTI_VERSION_MASK_MAJOR) >> JVMTI_VERSION_SHIFT_MAJOR; |
|
373 *minor = (version & JVMTI_VERSION_MASK_MINOR) >> JVMTI_VERSION_SHIFT_MINOR; |
|
374 *micro = (version & JVMTI_VERSION_MASK_MICRO) >> JVMTI_VERSION_SHIFT_MICRO; |
346 } |
375 } |
347 |
376 |
348 void JvmtiExport::enter_primordial_phase() { |
377 void JvmtiExport::enter_primordial_phase() { |
349 JvmtiEnvBase::set_phase(JVMTI_PHASE_PRIMORDIAL); |
378 JvmtiEnvBase::set_phase(JVMTI_PHASE_PRIMORDIAL); |
350 } |
379 } |