299 return MemTracker::tracking_level() == MemTracker::NMT_detail;
300 WB_END
301
302 #endif // INCLUDE_NMT
303
304 static jmethodID reflected_method_to_jmid(JavaThread* thread, JNIEnv* env, jobject method) {
305 assert(method != NULL, "method should not be null");
306 ThreadToNativeFromVM ttn(thread);
307 return env->FromReflectedMethod(method);
308 }
309
310 WB_ENTRY(void, WB_DeoptimizeAll(JNIEnv* env, jobject o))
311 MutexLockerEx mu(Compile_lock);
312 CodeCache::mark_all_nmethods_for_deoptimization();
313 VM_Deoptimize op;
314 VMThread::execute(&op);
315 WB_END
316
317 WB_ENTRY(jint, WB_DeoptimizeMethod(JNIEnv* env, jobject o, jobject method, jboolean is_osr))
318 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
319 MutexLockerEx mu(Compile_lock);
320 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
321 int result = 0;
322 nmethod* code;
323 if (is_osr) {
324 int bci = InvocationEntryBci;
325 while ((code = mh->lookup_osr_nmethod_for(bci, CompLevel_none, false)) != NULL) {
326 code->mark_for_deoptimization();
327 ++result;
328 bci = code->osr_entry_bci() + 1;
329 }
330 } else {
331 code = mh->code();
332 }
333 if (code != NULL) {
334 code->mark_for_deoptimization();
335 ++result;
336 }
337 result += CodeCache::mark_for_deoptimization(mh());
338 if (result > 0) {
339 VM_Deoptimize op;
340 VMThread::execute(&op);
341 }
342 return result;
343 WB_END
344
345 WB_ENTRY(jboolean, WB_IsMethodCompiled(JNIEnv* env, jobject o, jobject method, jboolean is_osr))
346 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
347 MutexLockerEx mu(Compile_lock);
348 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
349 nmethod* code = is_osr ? mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false) : mh->code();
350 if (code == NULL) {
351 return JNI_FALSE;
352 }
353 return (code->is_alive() && !code->is_marked_for_deoptimization());
354 WB_END
355
356 WB_ENTRY(jboolean, WB_IsMethodCompilable(JNIEnv* env, jobject o, jobject method, jint comp_level, jboolean is_osr))
357 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
358 MutexLockerEx mu(Compile_lock);
359 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
360 if (is_osr) {
361 return CompilationPolicy::can_be_osr_compiled(mh, comp_level);
362 } else {
363 return CompilationPolicy::can_be_compiled(mh, comp_level);
364 }
365 WB_END
366
367 WB_ENTRY(jboolean, WB_IsMethodQueuedForCompilation(JNIEnv* env, jobject o, jobject method))
368 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
369 MutexLockerEx mu(Compile_lock);
370 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
371 return mh->queued_for_compilation();
372 WB_END
373
374 WB_ENTRY(jint, WB_GetMethodCompilationLevel(JNIEnv* env, jobject o, jobject method, jboolean is_osr))
375 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
376 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
377 nmethod* code = is_osr ? mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false) : mh->code();
378 return (code != NULL ? code->comp_level() : CompLevel_none);
379 WB_END
380
381 WB_ENTRY(void, WB_MakeMethodNotCompilable(JNIEnv* env, jobject o, jobject method, jint comp_level, jboolean is_osr))
382 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
383 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
384 if (is_osr) {
385 mh->set_not_osr_compilable(comp_level, true /* report */, "WhiteBox");
386 } else {
387 mh->set_not_compilable(comp_level, true /* report */, "WhiteBox");
388 }
389 WB_END
390
391 WB_ENTRY(jint, WB_GetMethodEntryBci(JNIEnv* env, jobject o, jobject method))
392 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
393 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
394 nmethod* code = mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false);
395 return (code != NULL && code->is_osr_method() ? code->osr_entry_bci() : InvocationEntryBci);
396 WB_END
397
398 WB_ENTRY(jboolean, WB_TestSetDontInlineMethod(JNIEnv* env, jobject o, jobject method, jboolean value))
399 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
400 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
401 bool result = mh->dont_inline();
402 mh->set_dont_inline(value == JNI_TRUE);
403 return result;
404 WB_END
405
406 WB_ENTRY(jint, WB_GetCompileQueueSize(JNIEnv* env, jobject o, jint comp_level))
407 if (comp_level == CompLevel_any) {
408 return CompileBroker::queue_size(CompLevel_full_optimization) /* C2 */ +
409 CompileBroker::queue_size(CompLevel_full_profile) /* C1 */;
410 } else {
411 return CompileBroker::queue_size(comp_level);
412 }
413 WB_END
414
415 WB_ENTRY(jboolean, WB_TestSetForceInlineMethod(JNIEnv* env, jobject o, jobject method, jboolean value))
416 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
417 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
418 bool result = mh->force_inline();
419 mh->set_force_inline(value == JNI_TRUE);
420 return result;
421 WB_END
422
423 WB_ENTRY(jboolean, WB_EnqueueMethodForCompilation(JNIEnv* env, jobject o, jobject method, jint comp_level, jint bci))
424 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
425 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
426 nmethod* nm = CompileBroker::compile_method(mh, bci, comp_level, mh, mh->invocation_count(), "WhiteBox", THREAD);
427 MutexLockerEx mu(Compile_lock);
428 return (mh->queued_for_compilation() || nm != NULL);
429 WB_END
430
431 WB_ENTRY(void, WB_ClearMethodState(JNIEnv* env, jobject o, jobject method))
432 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
433 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
434 MutexLockerEx mu(Compile_lock);
435 MethodData* mdo = mh->method_data();
436 MethodCounters* mcs = mh->method_counters();
437
438 if (mdo != NULL) {
439 mdo->init();
440 ResourceMark rm;
441 int arg_count = mdo->method()->size_of_parameters();
442 for (int i = 0; i < arg_count; i++) {
443 mdo->set_arg_modified(i, 0);
444 }
445 }
446
447 mh->clear_not_c1_compilable();
448 mh->clear_not_c2_compilable();
449 mh->clear_not_c2_osr_compilable();
450 NOT_PRODUCT(mh->set_compiled_invocation_count(0));
451 if (mcs != NULL) {
452 mcs->backedge_counter()->init();
599 CC"(Ljava/lang/reflect/Executable;)V", (void*)&WB_ClearMethodState},
600 {CC"isInStringTable", CC"(Ljava/lang/String;)Z", (void*)&WB_IsInStringTable },
601 {CC"fullGC", CC"()V", (void*)&WB_FullGC },
602 {CC"readReservedMemory", CC"()V", (void*)&WB_ReadReservedMemory },
603 };
604
605 #undef CC
606
607 JVM_ENTRY(void, JVM_RegisterWhiteBoxMethods(JNIEnv* env, jclass wbclass))
608 {
609 if (WhiteBoxAPI) {
610 // Make sure that wbclass is loaded by the null classloader
611 instanceKlassHandle ikh = instanceKlassHandle(JNIHandles::resolve(wbclass)->klass());
612 Handle loader(ikh->class_loader());
613 if (loader.is_null()) {
614 ResourceMark rm;
615 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
616 bool result = true;
617 // one by one registration natives for exception catching
618 jclass exceptionKlass = env->FindClass(vmSymbols::java_lang_NoSuchMethodError()->as_C_string());
619 for (int i = 0, n = sizeof(methods) / sizeof(methods[0]); i < n; ++i) {
620 if (env->RegisterNatives(wbclass, methods + i, 1) != 0) {
621 result = false;
622 if (env->ExceptionCheck() && env->IsInstanceOf(env->ExceptionOccurred(), exceptionKlass)) {
623 // j.l.NoSuchMethodError is thrown when a method can't be found or a method is not native
624 // ignoring the exception
625 tty->print_cr("Warning: 'NoSuchMethodError' on register of sun.hotspot.WhiteBox::%s%s", methods[i].name, methods[i].signature);
626 env->ExceptionClear();
627 } else {
628 // register is failed w/o exception or w/ unexpected exception
629 tty->print_cr("Warning: unexpected error on register of sun.hotspot.WhiteBox::%s%s. All methods will be unregistered", methods[i].name, methods[i].signature);
630 env->UnregisterNatives(wbclass);
631 break;
632 }
633 }
634 }
635
636 if (result) {
637 WhiteBox::set_used();
638 }
639 }
640 }
641 }
642 JVM_END
|
299 return MemTracker::tracking_level() == MemTracker::NMT_detail;
300 WB_END
301
302 #endif // INCLUDE_NMT
303
304 static jmethodID reflected_method_to_jmid(JavaThread* thread, JNIEnv* env, jobject method) {
305 assert(method != NULL, "method should not be null");
306 ThreadToNativeFromVM ttn(thread);
307 return env->FromReflectedMethod(method);
308 }
309
310 WB_ENTRY(void, WB_DeoptimizeAll(JNIEnv* env, jobject o))
311 MutexLockerEx mu(Compile_lock);
312 CodeCache::mark_all_nmethods_for_deoptimization();
313 VM_Deoptimize op;
314 VMThread::execute(&op);
315 WB_END
316
317 WB_ENTRY(jint, WB_DeoptimizeMethod(JNIEnv* env, jobject o, jobject method, jboolean is_osr))
318 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
319 int result = 0;
320 CHECK_JNI_EXCEPTION_RETURN_VALUE(env, result);
321 MutexLockerEx mu(Compile_lock);
322 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
323 nmethod* code;
324 if (is_osr) {
325 int bci = InvocationEntryBci;
326 while ((code = mh->lookup_osr_nmethod_for(bci, CompLevel_none, false)) != NULL) {
327 code->mark_for_deoptimization();
328 ++result;
329 bci = code->osr_entry_bci() + 1;
330 }
331 } else {
332 code = mh->code();
333 }
334 if (code != NULL) {
335 code->mark_for_deoptimization();
336 ++result;
337 }
338 result += CodeCache::mark_for_deoptimization(mh());
339 if (result > 0) {
340 VM_Deoptimize op;
341 VMThread::execute(&op);
342 }
343 return result;
344 WB_END
345
346 WB_ENTRY(jboolean, WB_IsMethodCompiled(JNIEnv* env, jobject o, jobject method, jboolean is_osr))
347 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
348 CHECK_JNI_EXCEPTION_RETURN_VALUE(env, JNI_FALSE);
349 MutexLockerEx mu(Compile_lock);
350 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
351 nmethod* code = is_osr ? mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false) : mh->code();
352 if (code == NULL) {
353 return JNI_FALSE;
354 }
355 return (code->is_alive() && !code->is_marked_for_deoptimization());
356 WB_END
357
358 WB_ENTRY(jboolean, WB_IsMethodCompilable(JNIEnv* env, jobject o, jobject method, jint comp_level, jboolean is_osr))
359 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
360 CHECK_JNI_EXCEPTION_RETURN_VALUE(env, JNI_FALSE);
361 MutexLockerEx mu(Compile_lock);
362 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
363 if (is_osr) {
364 return CompilationPolicy::can_be_osr_compiled(mh, comp_level);
365 } else {
366 return CompilationPolicy::can_be_compiled(mh, comp_level);
367 }
368 WB_END
369
370 WB_ENTRY(jboolean, WB_IsMethodQueuedForCompilation(JNIEnv* env, jobject o, jobject method))
371 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
372 CHECK_JNI_EXCEPTION_RETURN_VALUE(env, JNI_FALSE);
373 MutexLockerEx mu(Compile_lock);
374 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
375 return mh->queued_for_compilation();
376 WB_END
377
378 WB_ENTRY(jint, WB_GetMethodCompilationLevel(JNIEnv* env, jobject o, jobject method, jboolean is_osr))
379 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
380 CHECK_JNI_EXCEPTION_RETURN_VALUE(env, CompLevel_none);
381 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
382 nmethod* code = is_osr ? mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false) : mh->code();
383 return (code != NULL ? code->comp_level() : CompLevel_none);
384 WB_END
385
386 WB_ENTRY(void, WB_MakeMethodNotCompilable(JNIEnv* env, jobject o, jobject method, jint comp_level, jboolean is_osr))
387 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
388 CHECK_JNI_EXCEPTION_RETURN(env);
389 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
390 if (is_osr) {
391 mh->set_not_osr_compilable(comp_level, true /* report */, "WhiteBox");
392 } else {
393 mh->set_not_compilable(comp_level, true /* report */, "WhiteBox");
394 }
395 WB_END
396
397 WB_ENTRY(jint, WB_GetMethodEntryBci(JNIEnv* env, jobject o, jobject method))
398 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
399 CHECK_JNI_EXCEPTION_RETURN_VALUE(env, InvocationEntryBci);
400 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
401 nmethod* code = mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false);
402 return (code != NULL && code->is_osr_method() ? code->osr_entry_bci() : InvocationEntryBci);
403 WB_END
404
405 WB_ENTRY(jboolean, WB_TestSetDontInlineMethod(JNIEnv* env, jobject o, jobject method, jboolean value))
406 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
407 CHECK_JNI_EXCEPTION_RETURN_VALUE(env, JNI_FALSE);
408 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
409 bool result = mh->dont_inline();
410 mh->set_dont_inline(value == JNI_TRUE);
411 return result;
412 WB_END
413
414 WB_ENTRY(jint, WB_GetCompileQueueSize(JNIEnv* env, jobject o, jint comp_level))
415 if (comp_level == CompLevel_any) {
416 return CompileBroker::queue_size(CompLevel_full_optimization) /* C2 */ +
417 CompileBroker::queue_size(CompLevel_full_profile) /* C1 */;
418 } else {
419 return CompileBroker::queue_size(comp_level);
420 }
421 WB_END
422
423 WB_ENTRY(jboolean, WB_TestSetForceInlineMethod(JNIEnv* env, jobject o, jobject method, jboolean value))
424 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
425 CHECK_JNI_EXCEPTION_RETURN_VALUE(env, JNI_FALSE);
426 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
427 bool result = mh->force_inline();
428 mh->set_force_inline(value == JNI_TRUE);
429 return result;
430 WB_END
431
432 WB_ENTRY(jboolean, WB_EnqueueMethodForCompilation(JNIEnv* env, jobject o, jobject method, jint comp_level, jint bci))
433 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
434 CHECK_JNI_EXCEPTION_RETURN_VALUE(env, JNI_FALSE);
435 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
436 nmethod* nm = CompileBroker::compile_method(mh, bci, comp_level, mh, mh->invocation_count(), "WhiteBox", THREAD);
437 MutexLockerEx mu(Compile_lock);
438 return (mh->queued_for_compilation() || nm != NULL);
439 WB_END
440
441 WB_ENTRY(void, WB_ClearMethodState(JNIEnv* env, jobject o, jobject method))
442 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
443 CHECK_JNI_EXCEPTION_RETURN(env);
444 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
445 MutexLockerEx mu(Compile_lock);
446 MethodData* mdo = mh->method_data();
447 MethodCounters* mcs = mh->method_counters();
448
449 if (mdo != NULL) {
450 mdo->init();
451 ResourceMark rm;
452 int arg_count = mdo->method()->size_of_parameters();
453 for (int i = 0; i < arg_count; i++) {
454 mdo->set_arg_modified(i, 0);
455 }
456 }
457
458 mh->clear_not_c1_compilable();
459 mh->clear_not_c2_compilable();
460 mh->clear_not_c2_osr_compilable();
461 NOT_PRODUCT(mh->set_compiled_invocation_count(0));
462 if (mcs != NULL) {
463 mcs->backedge_counter()->init();
610 CC"(Ljava/lang/reflect/Executable;)V", (void*)&WB_ClearMethodState},
611 {CC"isInStringTable", CC"(Ljava/lang/String;)Z", (void*)&WB_IsInStringTable },
612 {CC"fullGC", CC"()V", (void*)&WB_FullGC },
613 {CC"readReservedMemory", CC"()V", (void*)&WB_ReadReservedMemory },
614 };
615
616 #undef CC
617
618 JVM_ENTRY(void, JVM_RegisterWhiteBoxMethods(JNIEnv* env, jclass wbclass))
619 {
620 if (WhiteBoxAPI) {
621 // Make sure that wbclass is loaded by the null classloader
622 instanceKlassHandle ikh = instanceKlassHandle(JNIHandles::resolve(wbclass)->klass());
623 Handle loader(ikh->class_loader());
624 if (loader.is_null()) {
625 ResourceMark rm;
626 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
627 bool result = true;
628 // one by one registration natives for exception catching
629 jclass exceptionKlass = env->FindClass(vmSymbols::java_lang_NoSuchMethodError()->as_C_string());
630 CHECK_JNI_EXCEPTION_RETURN(env);
631 for (int i = 0, n = sizeof(methods) / sizeof(methods[0]); i < n; ++i) {
632 if (env->RegisterNatives(wbclass, methods + i, 1) != 0) {
633 result = false;
634 jthrowable throwable_obj = env->ExceptionOccurred();
635 if (throwable_obj != NULL) {
636 env->ExceptionClear();
637 if (env->IsInstanceOf(throwable_obj, exceptionKlass)) {
638 // j.l.NoSuchMethodError is thrown when a method can't be found or a method is not native
639 // ignoring the exception
640 tty->print_cr("Warning: 'NoSuchMethodError' on register of sun.hotspot.WhiteBox::%s%s", methods[i].name, methods[i].signature);
641 }
642 } else {
643 // register is failed w/o exception or w/ unexpected exception
644 tty->print_cr("Warning: unexpected error on register of sun.hotspot.WhiteBox::%s%s. All methods will be unregistered", methods[i].name, methods[i].signature);
645 env->UnregisterNatives(wbclass);
646 break;
647 }
648 }
649 }
650
651 if (result) {
652 WhiteBox::set_used();
653 }
654 }
655 }
656 }
657 JVM_END
|