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(); |