src/share/vm/prims/whitebox.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File hs-jdk9-8028785 Sdiff src/share/vm/prims

src/share/vm/prims/whitebox.cpp

Print this page




 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
src/share/vm/prims/whitebox.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File