36
36
#include " runtime/jniHandles.inline.hpp"
37
37
#include " runtime/javaCalls.hpp"
38
38
#include " jvmci/jniAccessMark.inline.hpp"
39
+ #include " jvmci/jvmciCompiler.hpp"
39
40
#include " jvmci/jvmciRuntime.hpp"
40
41
41
- JVMCICompileState::JVMCICompileState (CompileTask* task):
42
+ JVMCICompileState::JVMCICompileState (CompileTask* task, JVMCICompiler* compiler ):
42
43
_task(task),
44
+ _compiler(compiler),
43
45
_retryable(true ),
44
46
_failure_reason(NULL ),
45
47
_failure_reason_on_C_heap(false ) {
@@ -51,6 +53,20 @@ JVMCICompileState::JVMCICompileState(CompileTask* task):
51
53
_jvmti_can_post_on_exceptions = JvmtiExport::can_post_on_exceptions () ? 1 : 0 ;
52
54
_jvmti_can_pop_frame = JvmtiExport::can_pop_frame () ? 1 : 0 ;
53
55
_target_method_is_old = _task != NULL && _task->method ()->is_old ();
56
+ if (task->is_blocking ()) {
57
+ task->set_blocking_jvmci_compile_state (this );
58
+ }
59
+ }
60
+
61
+ // Update global JVMCI compilation ticks after 512 thread-local JVMCI compilation ticks.
62
+ // This mitigates the overhead of the atomic operation used for the global update.
63
+ #define THREAD_TICKS_PER_GLOBAL_TICKS (2 << 9 )
64
+ #define THREAD_TICKS_PER_GLOBAL_TICKS_MASK (THREAD_TICKS_PER_GLOBAL_TICKS - 1 )
65
+
66
+ void JVMCICompileState::inc_compilation_ticks () {
67
+ if ((++_compilation_ticks & THREAD_TICKS_PER_GLOBAL_TICKS_MASK) == 0 ) {
68
+ _compiler->inc_global_compilation_ticks ();
69
+ }
54
70
}
55
71
56
72
bool JVMCICompileState::jvmti_state_changed () const {
@@ -620,8 +636,8 @@ void JVMCIEnv::fthrow_error(const char* file, int line, const char* format, ...)
620
636
621
637
JVMCIObject JVMCIEnv::call_HotSpotJVMCIRuntime_compileMethod (JVMCIObject runtime, JVMCIObject method, int entry_bci,
622
638
jlong compile_state, int id) {
639
+ JavaThread* THREAD = JVMCI::compilation_tick (JavaThread::current ());
623
640
if (is_hotspot ()) {
624
- Thread* THREAD = Thread::current ();
625
641
JavaCallArguments jargs;
626
642
jargs.push_oop (Handle (THREAD, HotSpotJVMCI::resolve (runtime)));
627
643
jargs.push_oop (Handle (THREAD, HotSpotJVMCI::resolve (method)));
@@ -635,7 +651,7 @@ JVMCIObject JVMCIEnv::call_HotSpotJVMCIRuntime_compileMethod (JVMCIObject runtim
635
651
vmSymbols::compileMethod_signature (), &jargs, CHECK_ (JVMCIObject ()));
636
652
return wrap ((oop) result.get_jobject ());
637
653
} else {
638
- JNIAccessMark jni (this );
654
+ JNIAccessMark jni (this , THREAD );
639
655
jobject result = jni ()->CallNonvirtualObjectMethod (runtime.as_jobject (),
640
656
JNIJVMCI::HotSpotJVMCIRuntime::clazz (),
641
657
JNIJVMCI::HotSpotJVMCIRuntime::compileMethod_method (),
@@ -648,14 +664,14 @@ JVMCIObject JVMCIEnv::call_HotSpotJVMCIRuntime_compileMethod (JVMCIObject runtim
648
664
}
649
665
650
666
void JVMCIEnv::call_HotSpotJVMCIRuntime_bootstrapFinished (JVMCIObject runtime, JVMCIEnv* JVMCIENV) {
667
+ JavaThread* THREAD = JVMCI::compilation_tick (JavaThread::current ());
651
668
if (is_hotspot ()) {
652
- Thread* THREAD = Thread::current ();
653
669
JavaCallArguments jargs;
654
670
jargs.push_oop (Handle (THREAD, HotSpotJVMCI::resolve (runtime)));
655
671
JavaValue result (T_VOID);
656
672
JavaCalls::call_special (&result, HotSpotJVMCI::HotSpotJVMCIRuntime::klass (), vmSymbols::bootstrapFinished_name (), vmSymbols::void_method_signature (), &jargs, CHECK);
657
673
} else {
658
- JNIAccessMark jni (this );
674
+ JNIAccessMark jni (this , THREAD );
659
675
jni ()->CallNonvirtualVoidMethod (runtime.as_jobject (), JNIJVMCI::HotSpotJVMCIRuntime::clazz (), JNIJVMCI::HotSpotJVMCIRuntime::bootstrapFinished_method ());
660
676
661
677
}
@@ -681,7 +697,7 @@ void JVMCIEnv::call_HotSpotJVMCIRuntime_shutdown (JVMCIObject runtime) {
681
697
}
682
698
683
699
JVMCIObject JVMCIEnv::call_HotSpotJVMCIRuntime_runtime (JVMCIEnv* JVMCIENV) {
684
- JavaThread* THREAD = JavaThread::current ();
700
+ JavaThread* THREAD = JVMCI::compilation_tick ( JavaThread::current () );
685
701
if (is_hotspot ()) {
686
702
JavaCallArguments jargs;
687
703
JavaValue result (T_OBJECT);
@@ -698,7 +714,7 @@ JVMCIObject JVMCIEnv::call_HotSpotJVMCIRuntime_runtime (JVMCIEnv* JVMCIENV) {
698
714
}
699
715
700
716
JVMCIObject JVMCIEnv::call_JVMCI_getRuntime (JVMCIEnv* JVMCIENV) {
701
- JavaThread* THREAD = JavaThread::current ();
717
+ JavaThread* THREAD = JVMCI::compilation_tick ( JavaThread::current () );
702
718
if (is_hotspot ()) {
703
719
JavaCallArguments jargs;
704
720
JavaValue result (T_OBJECT);
@@ -715,7 +731,7 @@ JVMCIObject JVMCIEnv::call_JVMCI_getRuntime (JVMCIEnv* JVMCIENV) {
715
731
}
716
732
717
733
JVMCIObject JVMCIEnv::call_HotSpotJVMCIRuntime_getCompiler (JVMCIObject runtime, JVMCIEnv* JVMCIENV) {
718
- JavaThread* THREAD = JavaThread::current ();
734
+ JavaThread* THREAD = JVMCI::compilation_tick ( JavaThread::current () );
719
735
if (is_hotspot ()) {
720
736
JavaCallArguments jargs;
721
737
jargs.push_oop (Handle (THREAD, HotSpotJVMCI::resolve (runtime)));
@@ -734,7 +750,7 @@ JVMCIObject JVMCIEnv::call_HotSpotJVMCIRuntime_getCompiler (JVMCIObject runtime,
734
750
735
751
736
752
JVMCIObject JVMCIEnv::call_HotSpotJVMCIRuntime_callToString (JVMCIObject object, JVMCIEnv* JVMCIENV) {
737
- JavaThread* THREAD = JavaThread::current ();
753
+ JavaThread* THREAD = JVMCI::compilation_tick ( JavaThread::current () );
738
754
if (is_hotspot ()) {
739
755
JavaCallArguments jargs;
740
756
jargs.push_oop (Handle (THREAD, HotSpotJVMCI::resolve (object)));
@@ -758,7 +774,7 @@ JVMCIObject JVMCIEnv::call_HotSpotJVMCIRuntime_callToString(JVMCIObject object,
758
774
759
775
760
776
JVMCIObject JVMCIEnv::call_PrimitiveConstant_forTypeChar (jchar kind, jlong value, JVMCI_TRAPS) {
761
- JavaThread* THREAD = JavaThread::current ();
777
+ JavaThread* THREAD = JVMCI::compilation_tick ( JavaThread::current () );
762
778
if (is_hotspot ()) {
763
779
JavaCallArguments jargs;
764
780
jargs.push_int (kind);
@@ -782,7 +798,7 @@ JVMCIObject JVMCIEnv::call_PrimitiveConstant_forTypeChar(jchar kind, jlong value
782
798
}
783
799
784
800
JVMCIObject JVMCIEnv::call_JavaConstant_forFloat (float value, JVMCI_TRAPS) {
785
- JavaThread* THREAD = JavaThread::current ();
801
+ JavaThread* THREAD = JVMCI::compilation_tick ( JavaThread::current () );
786
802
if (is_hotspot ()) {
787
803
JavaCallArguments jargs;
788
804
jargs.push_float (value);
@@ -805,7 +821,7 @@ JVMCIObject JVMCIEnv::call_JavaConstant_forFloat(float value, JVMCI_TRAPS) {
805
821
}
806
822
807
823
JVMCIObject JVMCIEnv::call_JavaConstant_forDouble (double value, JVMCI_TRAPS) {
808
- JavaThread* THREAD = JavaThread::current ();
824
+ JavaThread* THREAD = JVMCI::compilation_tick ( JavaThread::current () );
809
825
if (is_hotspot ()) {
810
826
JavaCallArguments jargs;
811
827
jargs.push_double (value);
@@ -886,7 +902,7 @@ JVMCIObject JVMCIEnv::new_StackTraceElement(const methodHandle& method, int bci,
886
902
}
887
903
888
904
JVMCIObject JVMCIEnv::new_HotSpotNmethod (const methodHandle& method, const char * name, jboolean isDefault, jlong compileId, JVMCI_TRAPS) {
889
- JavaThread* THREAD = JavaThread::current ();
905
+ JavaThread* THREAD = JVMCI::compilation_tick ( JavaThread::current () );
890
906
891
907
JVMCIObject methodObject = get_jvmci_method (method, JVMCI_CHECK_ (JVMCIObject ()));
892
908
@@ -989,7 +1005,7 @@ JVMCIObject JVMCIEnv::get_jvmci_method(const methodHandle& method, JVMCI_TRAPS)
989
1005
return method_object;
990
1006
}
991
1007
992
- Thread * THREAD = Thread:: current ();
1008
+ JavaThread * THREAD = JVMCI::compilation_tick ( JavaThread:: current () );
993
1009
jmetadata handle = _runtime->allocate_handle (method);
994
1010
jboolean exception = false ;
995
1011
if (is_hotspot ()) {
@@ -1005,7 +1021,7 @@ JVMCIObject JVMCIEnv::get_jvmci_method(const methodHandle& method, JVMCI_TRAPS)
1005
1021
method_object = wrap ((oop)result.get_jobject ());
1006
1022
}
1007
1023
} else {
1008
- JNIAccessMark jni (this );
1024
+ JNIAccessMark jni (this , THREAD );
1009
1025
method_object = JNIJVMCI::wrap (jni ()->CallStaticObjectMethod (JNIJVMCI::HotSpotResolvedJavaMethodImpl::clazz (),
1010
1026
JNIJVMCI::HotSpotResolvedJavaMethodImpl_fromMetaspace_method (),
1011
1027
(jlong) handle));
@@ -1032,7 +1048,7 @@ JVMCIObject JVMCIEnv::get_jvmci_type(const JVMCIKlassHandle& klass, JVMCI_TRAPS)
1032
1048
}
1033
1049
1034
1050
jlong pointer = (jlong) klass ();
1035
- JavaThread* THREAD = JavaThread::current ();
1051
+ JavaThread* THREAD = JVMCI::compilation_tick ( JavaThread::current () );
1036
1052
JVMCIObject signature = create_string (klass->signature_name (), JVMCI_CHECK_ (JVMCIObject ()));
1037
1053
jboolean exception = false ;
1038
1054
if (is_hotspot ()) {
@@ -1071,7 +1087,7 @@ JVMCIObject JVMCIEnv::get_jvmci_constant_pool(const constantPoolHandle& cp, JVMC
1071
1087
JVMCIObject cp_object;
1072
1088
jmetadata handle = _runtime->allocate_handle (cp);
1073
1089
jboolean exception = false ;
1074
- JavaThread* THREAD = JavaThread::current ();
1090
+ JavaThread* THREAD = JVMCI::compilation_tick ( JavaThread::current () );
1075
1091
if (is_hotspot ()) {
1076
1092
JavaValue result (T_OBJECT);
1077
1093
JavaCallArguments args;
0 commit comments