src/hotspot/share/prims/whitebox.cpp
changeset 54623 1126f0607c70
parent 54511 fbfcebad8e66
child 54678 93f09ca4a7f8
equal deleted inserted replaced
54622:a8dcacf95bff 54623:1126f0607c70
   815   VMThread::execute(&op);
   815   VMThread::execute(&op);
   816   return op.result();
   816   return op.result();
   817 WB_END
   817 WB_END
   818 
   818 
   819 WB_ENTRY(void, WB_DeoptimizeAll(JNIEnv* env, jobject o))
   819 WB_ENTRY(void, WB_DeoptimizeAll(JNIEnv* env, jobject o))
   820   MutexLockerEx mu(Compile_lock);
   820   MutexLocker mu(Compile_lock);
   821   CodeCache::mark_all_nmethods_for_deoptimization();
   821   CodeCache::mark_all_nmethods_for_deoptimization();
   822   VM_Deoptimize op;
   822   VM_Deoptimize op;
   823   VMThread::execute(&op);
   823   VMThread::execute(&op);
   824 WB_END
   824 WB_END
   825 
   825 
   826 WB_ENTRY(jint, WB_DeoptimizeMethod(JNIEnv* env, jobject o, jobject method, jboolean is_osr))
   826 WB_ENTRY(jint, WB_DeoptimizeMethod(JNIEnv* env, jobject o, jobject method, jboolean is_osr))
   827   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
   827   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
   828   int result = 0;
   828   int result = 0;
   829   CHECK_JNI_EXCEPTION_(env, result);
   829   CHECK_JNI_EXCEPTION_(env, result);
   830   MutexLockerEx mu(Compile_lock);
   830   MutexLocker mu(Compile_lock);
   831   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
   831   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
   832   if (is_osr) {
   832   if (is_osr) {
   833     result += mh->mark_osr_nmethods();
   833     result += mh->mark_osr_nmethods();
   834   } else if (mh->code() != NULL) {
   834   } else if (mh->code() != NULL) {
   835     mh->code()->mark_for_deoptimization();
   835     mh->code()->mark_for_deoptimization();
   844 WB_END
   844 WB_END
   845 
   845 
   846 WB_ENTRY(jboolean, WB_IsMethodCompiled(JNIEnv* env, jobject o, jobject method, jboolean is_osr))
   846 WB_ENTRY(jboolean, WB_IsMethodCompiled(JNIEnv* env, jobject o, jobject method, jboolean is_osr))
   847   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
   847   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
   848   CHECK_JNI_EXCEPTION_(env, JNI_FALSE);
   848   CHECK_JNI_EXCEPTION_(env, JNI_FALSE);
   849   MutexLockerEx mu(Compile_lock);
   849   MutexLocker mu(Compile_lock);
   850   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
   850   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
   851   CompiledMethod* code = is_osr ? mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false) : mh->code();
   851   CompiledMethod* code = is_osr ? mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false) : mh->code();
   852   if (code == NULL) {
   852   if (code == NULL) {
   853     return JNI_FALSE;
   853     return JNI_FALSE;
   854   }
   854   }
   859   if (method == NULL || comp_level > MIN2((CompLevel) TieredStopAtLevel, CompLevel_highest_tier)) {
   859   if (method == NULL || comp_level > MIN2((CompLevel) TieredStopAtLevel, CompLevel_highest_tier)) {
   860     return false;
   860     return false;
   861   }
   861   }
   862   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
   862   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
   863   CHECK_JNI_EXCEPTION_(env, JNI_FALSE);
   863   CHECK_JNI_EXCEPTION_(env, JNI_FALSE);
   864   MutexLockerEx mu(Compile_lock);
   864   MutexLocker mu(Compile_lock);
   865   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
   865   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
   866   if (is_osr) {
   866   if (is_osr) {
   867     return CompilationPolicy::can_be_osr_compiled(mh, comp_level);
   867     return CompilationPolicy::can_be_osr_compiled(mh, comp_level);
   868   } else {
   868   } else {
   869     return CompilationPolicy::can_be_compiled(mh, comp_level);
   869     return CompilationPolicy::can_be_compiled(mh, comp_level);
   871 WB_END
   871 WB_END
   872 
   872 
   873 WB_ENTRY(jboolean, WB_IsMethodQueuedForCompilation(JNIEnv* env, jobject o, jobject method))
   873 WB_ENTRY(jboolean, WB_IsMethodQueuedForCompilation(JNIEnv* env, jobject o, jobject method))
   874   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
   874   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
   875   CHECK_JNI_EXCEPTION_(env, JNI_FALSE);
   875   CHECK_JNI_EXCEPTION_(env, JNI_FALSE);
   876   MutexLockerEx mu(Compile_lock);
   876   MutexLocker mu(Compile_lock);
   877   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
   877   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
   878   return mh->queued_for_compilation();
   878   return mh->queued_for_compilation();
   879 WB_END
   879 WB_END
   880 
   880 
   881 WB_ENTRY(jboolean, WB_IsIntrinsicAvailable(JNIEnv* env, jobject o, jobject method, jobject compilation_context, jint compLevel))
   881 WB_ENTRY(jboolean, WB_IsIntrinsicAvailable(JNIEnv* env, jobject o, jobject method, jobject compilation_context, jint compLevel))
   980   bool is_blocking = !directive->BackgroundCompilationOption;
   980   bool is_blocking = !directive->BackgroundCompilationOption;
   981   DirectivesStack::release(directive);
   981   DirectivesStack::release(directive);
   982 
   982 
   983   // Compile method and check result
   983   // Compile method and check result
   984   nmethod* nm = CompileBroker::compile_method(mh, bci, comp_level, mh, mh->invocation_count(), CompileTask::Reason_Whitebox, THREAD);
   984   nmethod* nm = CompileBroker::compile_method(mh, bci, comp_level, mh, mh->invocation_count(), CompileTask::Reason_Whitebox, THREAD);
   985   MutexLockerEx mu(Compile_lock);
   985   MutexLocker mu(Compile_lock);
   986   bool is_queued = mh->queued_for_compilation();
   986   bool is_queued = mh->queued_for_compilation();
   987   if ((!is_blocking && is_queued) || nm != NULL) {
   987   if ((!is_blocking && is_queued) || nm != NULL) {
   988     return true;
   988     return true;
   989   }
   989   }
   990   tty->print("WB error: failed to %s compile at level %d method ", is_blocking ? "blocking" : "", comp_level);
   990   tty->print("WB error: failed to %s compile at level %d method ", is_blocking ? "blocking" : "", comp_level);
  1080 
  1080 
  1081 WB_ENTRY(void, WB_ClearMethodState(JNIEnv* env, jobject o, jobject method))
  1081 WB_ENTRY(void, WB_ClearMethodState(JNIEnv* env, jobject o, jobject method))
  1082   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
  1082   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
  1083   CHECK_JNI_EXCEPTION(env);
  1083   CHECK_JNI_EXCEPTION(env);
  1084   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
  1084   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
  1085   MutexLockerEx mu(Compile_lock);
  1085   MutexLocker mu(Compile_lock);
  1086   MethodData* mdo = mh->method_data();
  1086   MethodData* mdo = mh->method_data();
  1087   MethodCounters* mcs = mh->method_counters();
  1087   MethodCounters* mcs = mh->method_counters();
  1088 
  1088 
  1089   if (mdo != NULL) {
  1089   if (mdo != NULL) {
  1090     mdo->init();
  1090     mdo->init();
  1091     ResourceMark rm;
  1091     ResourceMark rm;
  1092     int arg_count = mdo->method()->size_of_parameters();
  1092     int arg_count = mdo->method()->size_of_parameters();
  1093     for (int i = 0; i < arg_count; i++) {
  1093     for (int i = 0; i < arg_count; i++) {
  1094       mdo->set_arg_modified(i, 0);
  1094       mdo->set_arg_modified(i, 0);
  1095     }
  1095     }
  1096     MutexLockerEx mu(mdo->extra_data_lock());
  1096     MutexLocker mu(mdo->extra_data_lock());
  1097     mdo->clean_method_data(/*always_clean*/true);
  1097     mdo->clean_method_data(/*always_clean*/true);
  1098   }
  1098   }
  1099 
  1099 
  1100   mh->clear_not_c1_compilable();
  1100   mh->clear_not_c1_compilable();
  1101   mh->clear_not_c2_compilable();
  1101   mh->clear_not_c2_compilable();
  1340 WB_ENTRY(void, WB_LockCompilation(JNIEnv* env, jobject o, jlong timeout))
  1340 WB_ENTRY(void, WB_LockCompilation(JNIEnv* env, jobject o, jlong timeout))
  1341   WhiteBox::compilation_locked = true;
  1341   WhiteBox::compilation_locked = true;
  1342 WB_END
  1342 WB_END
  1343 
  1343 
  1344 WB_ENTRY(void, WB_UnlockCompilation(JNIEnv* env, jobject o))
  1344 WB_ENTRY(void, WB_UnlockCompilation(JNIEnv* env, jobject o))
  1345   MonitorLockerEx mo(Compilation_lock, Mutex::_no_safepoint_check_flag);
  1345   MonitorLocker mo(Compilation_lock, Mutex::_no_safepoint_check_flag);
  1346   WhiteBox::compilation_locked = false;
  1346   WhiteBox::compilation_locked = false;
  1347   mo.notify_all();
  1347   mo.notify_all();
  1348 WB_END
  1348 WB_END
  1349 
  1349 
  1350 WB_ENTRY(void, WB_ForceNMethodSweep(JNIEnv* env, jobject o))
  1350 WB_ENTRY(void, WB_ForceNMethodSweep(JNIEnv* env, jobject o))
  1500   int full_size = CodeBlob::align_code_offset(sizeof(BufferBlob));
  1500   int full_size = CodeBlob::align_code_offset(sizeof(BufferBlob));
  1501   if (full_size < size) {
  1501   if (full_size < size) {
  1502     full_size += align_up(size - full_size, oopSize);
  1502     full_size += align_up(size - full_size, oopSize);
  1503   }
  1503   }
  1504   {
  1504   {
  1505     MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
  1505     MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
  1506     blob = (BufferBlob*) CodeCache::allocate(full_size, blob_type);
  1506     blob = (BufferBlob*) CodeCache::allocate(full_size, blob_type);
  1507     if (blob != NULL) {
  1507     if (blob != NULL) {
  1508       ::new (blob) BufferBlob("WB::DummyBlob", full_size);
  1508       ::new (blob) BufferBlob("WB::DummyBlob", full_size);
  1509     }
  1509     }
  1510   }
  1510   }
  1530 
  1530 
  1531 WB_ENTRY(jobjectArray, WB_GetCodeHeapEntries(JNIEnv* env, jobject o, jint blob_type))
  1531 WB_ENTRY(jobjectArray, WB_GetCodeHeapEntries(JNIEnv* env, jobject o, jint blob_type))
  1532   ResourceMark rm;
  1532   ResourceMark rm;
  1533   GrowableArray<CodeBlobStub*> blobs;
  1533   GrowableArray<CodeBlobStub*> blobs;
  1534   {
  1534   {
  1535     MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
  1535     MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
  1536     CodeHeap* heap = WhiteBox::get_code_heap(blob_type);
  1536     CodeHeap* heap = WhiteBox::get_code_heap(blob_type);
  1537     if (heap == NULL) {
  1537     if (heap == NULL) {
  1538       return NULL;
  1538       return NULL;
  1539     }
  1539     }
  1540     for (CodeBlob* cb = (CodeBlob*) heap->first();
  1540     for (CodeBlob* cb = (CodeBlob*) heap->first();
  1716 
  1716 
  1717 WB_ENTRY(void, WB_AssertMatchingSafepointCalls(JNIEnv* env, jobject o, jboolean mutexSafepointValue, jboolean attemptedNoSafepointValue))
  1717 WB_ENTRY(void, WB_AssertMatchingSafepointCalls(JNIEnv* env, jobject o, jboolean mutexSafepointValue, jboolean attemptedNoSafepointValue))
  1718   Monitor::SafepointCheckRequired sfpt_check_required = mutexSafepointValue ?
  1718   Monitor::SafepointCheckRequired sfpt_check_required = mutexSafepointValue ?
  1719                                            Monitor::_safepoint_check_always :
  1719                                            Monitor::_safepoint_check_always :
  1720                                            Monitor::_safepoint_check_never;
  1720                                            Monitor::_safepoint_check_never;
  1721   MutexLockerEx ml(new Mutex(Mutex::leaf, "SFPT_Test_lock", true, sfpt_check_required),
  1721   Monitor::SafepointCheckFlag sfpt_check_attempted = attemptedNoSafepointValue ?
  1722                    attemptedNoSafepointValue == JNI_TRUE);
  1722                                            Monitor::_no_safepoint_check_flag :
       
  1723                                            Monitor::_safepoint_check_flag;
       
  1724   MutexLocker ml(new Mutex(Mutex::leaf, "SFPT_Test_lock", true, sfpt_check_required),
       
  1725                  sfpt_check_attempted);
  1723 WB_END
  1726 WB_END
  1724 
  1727 
  1725 WB_ENTRY(jboolean, WB_IsMonitorInflated(JNIEnv* env, jobject wb, jobject obj))
  1728 WB_ENTRY(jboolean, WB_IsMonitorInflated(JNIEnv* env, jobject wb, jobject obj))
  1726   oop obj_oop = JNIHandles::resolve(obj);
  1729   oop obj_oop = JNIHandles::resolve(obj);
  1727   return (jboolean) obj_oop->mark()->has_monitor();
  1730   return (jboolean) obj_oop->mark()->has_monitor();