956 957 mh->clear_not_c1_compilable(); 958 mh->clear_not_c2_compilable(); 959 mh->clear_not_c2_osr_compilable(); 960 NOT_PRODUCT(mh->set_compiled_invocation_count(0)); 961 if (mcs != NULL) { 962 mcs->backedge_counter()->init(); 963 mcs->invocation_counter()->init(); 964 mcs->set_interpreter_invocation_count(0); 965 mcs->set_interpreter_throwout_count(0); 966 967 #ifdef TIERED 968 mcs->set_rate(0.0F); 969 mh->set_prev_event_count(0); 970 mh->set_prev_time(0); 971 #endif 972 } 973 WB_END 974 975 template <typename T> 976 static bool GetVMFlag(JavaThread* thread, JNIEnv* env, jstring name, T* value, Flag::Error (*TAt)(const char*, T*, bool, bool)) { 977 if (name == NULL) { 978 return false; 979 } 980 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI 981 const char* flag_name = env->GetStringUTFChars(name, NULL); 982 CHECK_JNI_EXCEPTION_(env, false); 983 Flag::Error result = (*TAt)(flag_name, value, true, true); 984 env->ReleaseStringUTFChars(name, flag_name); 985 return (result == Flag::SUCCESS); 986 } 987 988 template <typename T> 989 static bool SetVMFlag(JavaThread* thread, JNIEnv* env, jstring name, T* value, Flag::Error (*TAtPut)(const char*, T*, Flag::Flags)) { 990 if (name == NULL) { 991 return false; 992 } 993 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI 994 const char* flag_name = env->GetStringUTFChars(name, NULL); 995 CHECK_JNI_EXCEPTION_(env, false); 996 Flag::Error result = (*TAtPut)(flag_name, value, Flag::INTERNAL); 997 env->ReleaseStringUTFChars(name, flag_name); 998 return (result == Flag::SUCCESS); 999 } 1000 1001 template <typename T> 1002 static jobject box(JavaThread* thread, JNIEnv* env, Symbol* name, Symbol* sig, T value) { 1003 ResourceMark rm(thread); 1004 jclass clazz = env->FindClass(name->as_C_string()); 1005 CHECK_JNI_EXCEPTION_(env, NULL); 1006 jmethodID methodID = env->GetStaticMethodID(clazz, 1007 vmSymbols::valueOf_name()->as_C_string(), 1008 sig->as_C_string()); 1009 CHECK_JNI_EXCEPTION_(env, NULL); 1010 jobject result = env->CallStaticObjectMethod(clazz, methodID, value); 1011 CHECK_JNI_EXCEPTION_(env, NULL); 1012 return result; 1013 } 1014 1015 static jobject booleanBox(JavaThread* thread, JNIEnv* env, jboolean value) { 1016 return box(thread, env, vmSymbols::java_lang_Boolean(), vmSymbols::Boolean_valueOf_signature(), value); 1017 } 1018 static jobject integerBox(JavaThread* thread, JNIEnv* env, jint value) { 1019 return box(thread, env, vmSymbols::java_lang_Integer(), vmSymbols::Integer_valueOf_signature(), value); 1020 } 1021 static jobject longBox(JavaThread* thread, JNIEnv* env, jlong value) { 1022 return box(thread, env, vmSymbols::java_lang_Long(), vmSymbols::Long_valueOf_signature(), value); 1023 } 1024 /* static jobject floatBox(JavaThread* thread, JNIEnv* env, jfloat value) { 1025 return box(thread, env, vmSymbols::java_lang_Float(), vmSymbols::Float_valueOf_signature(), value); 1026 }*/ 1027 static jobject doubleBox(JavaThread* thread, JNIEnv* env, jdouble value) { 1028 return box(thread, env, vmSymbols::java_lang_Double(), vmSymbols::Double_valueOf_signature(), value); 1029 } 1030 1031 static Flag* getVMFlag(JavaThread* thread, JNIEnv* env, jstring name) { 1032 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI 1033 const char* flag_name = env->GetStringUTFChars(name, NULL); 1034 CHECK_JNI_EXCEPTION_(env, NULL); 1035 Flag* result = Flag::find_flag(flag_name, strlen(flag_name), true, true); 1036 env->ReleaseStringUTFChars(name, flag_name); 1037 return result; 1038 } 1039 1040 WB_ENTRY(jboolean, WB_IsConstantVMFlag(JNIEnv* env, jobject o, jstring name)) 1041 Flag* flag = getVMFlag(thread, env, name); 1042 return (flag != NULL) && flag->is_constant_in_binary(); 1043 WB_END 1044 1045 WB_ENTRY(jboolean, WB_IsLockedVMFlag(JNIEnv* env, jobject o, jstring name)) 1046 Flag* flag = getVMFlag(thread, env, name); 1047 return (flag != NULL) && !(flag->is_unlocked() || flag->is_unlocker()); 1048 WB_END 1049 1050 WB_ENTRY(jobject, WB_GetBooleanVMFlag(JNIEnv* env, jobject o, jstring name)) 1051 bool result; 1052 if (GetVMFlag <bool> (thread, env, name, &result, &CommandLineFlags::boolAt)) { 1053 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI 1054 return booleanBox(thread, env, result); 1055 } 1056 return NULL; 1057 WB_END 1058 1059 WB_ENTRY(jobject, WB_GetIntVMFlag(JNIEnv* env, jobject o, jstring name)) 1060 int result; 1061 if (GetVMFlag <int> (thread, env, name, &result, &CommandLineFlags::intAt)) { 1062 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI 1063 return longBox(thread, env, result); 1064 } 1065 return NULL; 1066 WB_END 1067 1068 WB_ENTRY(jobject, WB_GetUintVMFlag(JNIEnv* env, jobject o, jstring name)) 1069 uint result; 1070 if (GetVMFlag <uint> (thread, env, name, &result, &CommandLineFlags::uintAt)) { 1071 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI 1072 return longBox(thread, env, result); 1073 } 1074 return NULL; 1075 WB_END 1076 1077 WB_ENTRY(jobject, WB_GetIntxVMFlag(JNIEnv* env, jobject o, jstring name)) 1078 intx result; 1079 if (GetVMFlag <intx> (thread, env, name, &result, &CommandLineFlags::intxAt)) { 1080 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI 1081 return longBox(thread, env, result); 1082 } 1083 return NULL; 1084 WB_END 1085 1086 WB_ENTRY(jobject, WB_GetUintxVMFlag(JNIEnv* env, jobject o, jstring name)) 1087 uintx result; 1088 if (GetVMFlag <uintx> (thread, env, name, &result, &CommandLineFlags::uintxAt)) { 1089 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI 1090 return longBox(thread, env, result); 1091 } 1092 return NULL; 1093 WB_END 1094 1095 WB_ENTRY(jobject, WB_GetUint64VMFlag(JNIEnv* env, jobject o, jstring name)) 1096 uint64_t result; 1097 if (GetVMFlag <uint64_t> (thread, env, name, &result, &CommandLineFlags::uint64_tAt)) { 1098 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI 1099 return longBox(thread, env, result); 1100 } 1101 return NULL; 1102 WB_END 1103 1104 WB_ENTRY(jobject, WB_GetSizeTVMFlag(JNIEnv* env, jobject o, jstring name)) 1105 uintx result; 1106 if (GetVMFlag <size_t> (thread, env, name, &result, &CommandLineFlags::size_tAt)) { 1107 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI 1108 return longBox(thread, env, result); 1109 } 1110 return NULL; 1111 WB_END 1112 1113 WB_ENTRY(jobject, WB_GetDoubleVMFlag(JNIEnv* env, jobject o, jstring name)) 1114 double result; 1115 if (GetVMFlag <double> (thread, env, name, &result, &CommandLineFlags::doubleAt)) { 1116 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI 1117 return doubleBox(thread, env, result); 1118 } 1119 return NULL; 1120 WB_END 1121 1122 WB_ENTRY(jstring, WB_GetStringVMFlag(JNIEnv* env, jobject o, jstring name)) 1123 ccstr ccstrResult; 1124 if (GetVMFlag <ccstr> (thread, env, name, &ccstrResult, &CommandLineFlags::ccstrAt)) { 1125 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI 1126 jstring result = env->NewStringUTF(ccstrResult); 1127 CHECK_JNI_EXCEPTION_(env, NULL); 1128 return result; 1129 } 1130 return NULL; 1131 WB_END 1132 1133 WB_ENTRY(void, WB_SetBooleanVMFlag(JNIEnv* env, jobject o, jstring name, jboolean value)) 1134 bool result = value == JNI_TRUE ? true : false; 1135 SetVMFlag <bool> (thread, env, name, &result, &CommandLineFlags::boolAtPut); 1136 WB_END 1137 1138 WB_ENTRY(void, WB_SetIntVMFlag(JNIEnv* env, jobject o, jstring name, jlong value)) 1139 int result = value; 1140 SetVMFlag <int> (thread, env, name, &result, &CommandLineFlags::intAtPut); 1141 WB_END 1142 1143 WB_ENTRY(void, WB_SetUintVMFlag(JNIEnv* env, jobject o, jstring name, jlong value)) 1144 uint result = value; 1145 SetVMFlag <uint> (thread, env, name, &result, &CommandLineFlags::uintAtPut); 1146 WB_END 1147 1148 WB_ENTRY(void, WB_SetIntxVMFlag(JNIEnv* env, jobject o, jstring name, jlong value)) 1149 intx result = value; 1150 SetVMFlag <intx> (thread, env, name, &result, &CommandLineFlags::intxAtPut); 1151 WB_END 1152 1153 WB_ENTRY(void, WB_SetUintxVMFlag(JNIEnv* env, jobject o, jstring name, jlong value)) 1154 uintx result = value; 1155 SetVMFlag <uintx> (thread, env, name, &result, &CommandLineFlags::uintxAtPut); 1156 WB_END 1157 1158 WB_ENTRY(void, WB_SetUint64VMFlag(JNIEnv* env, jobject o, jstring name, jlong value)) 1159 uint64_t result = value; 1160 SetVMFlag <uint64_t> (thread, env, name, &result, &CommandLineFlags::uint64_tAtPut); 1161 WB_END 1162 1163 WB_ENTRY(void, WB_SetSizeTVMFlag(JNIEnv* env, jobject o, jstring name, jlong value)) 1164 size_t result = value; 1165 SetVMFlag <size_t> (thread, env, name, &result, &CommandLineFlags::size_tAtPut); 1166 WB_END 1167 1168 WB_ENTRY(void, WB_SetDoubleVMFlag(JNIEnv* env, jobject o, jstring name, jdouble value)) 1169 double result = value; 1170 SetVMFlag <double> (thread, env, name, &result, &CommandLineFlags::doubleAtPut); 1171 WB_END 1172 1173 WB_ENTRY(void, WB_SetStringVMFlag(JNIEnv* env, jobject o, jstring name, jstring value)) 1174 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI 1175 const char* ccstrValue; 1176 if (value == NULL) { 1177 ccstrValue = NULL; 1178 } 1179 else { 1180 ccstrValue = env->GetStringUTFChars(value, NULL); 1181 CHECK_JNI_EXCEPTION(env); 1182 } 1183 ccstr ccstrResult = ccstrValue; 1184 bool needFree; 1185 { 1186 ThreadInVMfromNative ttvfn(thread); // back to VM 1187 needFree = SetVMFlag <ccstr> (thread, env, name, &ccstrResult, &CommandLineFlags::ccstrAtPut); 1188 } 1189 if (value != NULL) { 1190 env->ReleaseStringUTFChars(value, ccstrValue); 1191 } 1192 if (needFree) { 1193 FREE_C_HEAP_ARRAY(char, ccstrResult); 1194 } 1195 WB_END 1196 1197 WB_ENTRY(void, WB_LockCompilation(JNIEnv* env, jobject o, jlong timeout)) 1198 WhiteBox::compilation_locked = true; 1199 WB_END 1200 1201 WB_ENTRY(void, WB_UnlockCompilation(JNIEnv* env, jobject o)) 1202 MonitorLockerEx mo(Compilation_lock, Mutex::_no_safepoint_check_flag); 1203 WhiteBox::compilation_locked = false; 1204 mo.notify_all(); 1205 WB_END 1206 1207 WB_ENTRY(void, WB_ForceNMethodSweep(JNIEnv* env, jobject o)) | 956 957 mh->clear_not_c1_compilable(); 958 mh->clear_not_c2_compilable(); 959 mh->clear_not_c2_osr_compilable(); 960 NOT_PRODUCT(mh->set_compiled_invocation_count(0)); 961 if (mcs != NULL) { 962 mcs->backedge_counter()->init(); 963 mcs->invocation_counter()->init(); 964 mcs->set_interpreter_invocation_count(0); 965 mcs->set_interpreter_throwout_count(0); 966 967 #ifdef TIERED 968 mcs->set_rate(0.0F); 969 mh->set_prev_event_count(0); 970 mh->set_prev_time(0); 971 #endif 972 } 973 WB_END 974 975 template <typename T> 976 static bool GetVMFlag(JavaThread* thread, JNIEnv* env, jstring name, T* value, JVMFlag::Error (*TAt)(const char*, T*, bool, bool)) { 977 if (name == NULL) { 978 return false; 979 } 980 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI 981 const char* flag_name = env->GetStringUTFChars(name, NULL); 982 CHECK_JNI_EXCEPTION_(env, false); 983 JVMFlag::Error result = (*TAt)(flag_name, value, true, true); 984 env->ReleaseStringUTFChars(name, flag_name); 985 return (result == JVMFlag::SUCCESS); 986 } 987 988 template <typename T> 989 static bool SetVMFlag(JavaThread* thread, JNIEnv* env, jstring name, T* value, JVMFlag::Error (*TAtPut)(const char*, T*, JVMFlag::Flags)) { 990 if (name == NULL) { 991 return false; 992 } 993 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI 994 const char* flag_name = env->GetStringUTFChars(name, NULL); 995 CHECK_JNI_EXCEPTION_(env, false); 996 JVMFlag::Error result = (*TAtPut)(flag_name, value, JVMFlag::INTERNAL); 997 env->ReleaseStringUTFChars(name, flag_name); 998 return (result == JVMFlag::SUCCESS); 999 } 1000 1001 template <typename T> 1002 static jobject box(JavaThread* thread, JNIEnv* env, Symbol* name, Symbol* sig, T value) { 1003 ResourceMark rm(thread); 1004 jclass clazz = env->FindClass(name->as_C_string()); 1005 CHECK_JNI_EXCEPTION_(env, NULL); 1006 jmethodID methodID = env->GetStaticMethodID(clazz, 1007 vmSymbols::valueOf_name()->as_C_string(), 1008 sig->as_C_string()); 1009 CHECK_JNI_EXCEPTION_(env, NULL); 1010 jobject result = env->CallStaticObjectMethod(clazz, methodID, value); 1011 CHECK_JNI_EXCEPTION_(env, NULL); 1012 return result; 1013 } 1014 1015 static jobject booleanBox(JavaThread* thread, JNIEnv* env, jboolean value) { 1016 return box(thread, env, vmSymbols::java_lang_Boolean(), vmSymbols::Boolean_valueOf_signature(), value); 1017 } 1018 static jobject integerBox(JavaThread* thread, JNIEnv* env, jint value) { 1019 return box(thread, env, vmSymbols::java_lang_Integer(), vmSymbols::Integer_valueOf_signature(), value); 1020 } 1021 static jobject longBox(JavaThread* thread, JNIEnv* env, jlong value) { 1022 return box(thread, env, vmSymbols::java_lang_Long(), vmSymbols::Long_valueOf_signature(), value); 1023 } 1024 /* static jobject floatBox(JavaThread* thread, JNIEnv* env, jfloat value) { 1025 return box(thread, env, vmSymbols::java_lang_Float(), vmSymbols::Float_valueOf_signature(), value); 1026 }*/ 1027 static jobject doubleBox(JavaThread* thread, JNIEnv* env, jdouble value) { 1028 return box(thread, env, vmSymbols::java_lang_Double(), vmSymbols::Double_valueOf_signature(), value); 1029 } 1030 1031 static JVMFlag* getVMFlag(JavaThread* thread, JNIEnv* env, jstring name) { 1032 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI 1033 const char* flag_name = env->GetStringUTFChars(name, NULL); 1034 CHECK_JNI_EXCEPTION_(env, NULL); 1035 JVMFlag* result = JVMFlag::find_flag(flag_name, strlen(flag_name), true, true); 1036 env->ReleaseStringUTFChars(name, flag_name); 1037 return result; 1038 } 1039 1040 WB_ENTRY(jboolean, WB_IsConstantVMFlag(JNIEnv* env, jobject o, jstring name)) 1041 JVMFlag* flag = getVMFlag(thread, env, name); 1042 return (flag != NULL) && flag->is_constant_in_binary(); 1043 WB_END 1044 1045 WB_ENTRY(jboolean, WB_IsLockedVMFlag(JNIEnv* env, jobject o, jstring name)) 1046 JVMFlag* flag = getVMFlag(thread, env, name); 1047 return (flag != NULL) && !(flag->is_unlocked() || flag->is_unlocker()); 1048 WB_END 1049 1050 WB_ENTRY(jobject, WB_GetBooleanVMFlag(JNIEnv* env, jobject o, jstring name)) 1051 bool result; 1052 if (GetVMFlag <bool> (thread, env, name, &result, &JVMFlag::boolAt)) { 1053 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI 1054 return booleanBox(thread, env, result); 1055 } 1056 return NULL; 1057 WB_END 1058 1059 WB_ENTRY(jobject, WB_GetIntVMFlag(JNIEnv* env, jobject o, jstring name)) 1060 int result; 1061 if (GetVMFlag <int> (thread, env, name, &result, &JVMFlag::intAt)) { 1062 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI 1063 return longBox(thread, env, result); 1064 } 1065 return NULL; 1066 WB_END 1067 1068 WB_ENTRY(jobject, WB_GetUintVMFlag(JNIEnv* env, jobject o, jstring name)) 1069 uint result; 1070 if (GetVMFlag <uint> (thread, env, name, &result, &JVMFlag::uintAt)) { 1071 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI 1072 return longBox(thread, env, result); 1073 } 1074 return NULL; 1075 WB_END 1076 1077 WB_ENTRY(jobject, WB_GetIntxVMFlag(JNIEnv* env, jobject o, jstring name)) 1078 intx result; 1079 if (GetVMFlag <intx> (thread, env, name, &result, &JVMFlag::intxAt)) { 1080 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI 1081 return longBox(thread, env, result); 1082 } 1083 return NULL; 1084 WB_END 1085 1086 WB_ENTRY(jobject, WB_GetUintxVMFlag(JNIEnv* env, jobject o, jstring name)) 1087 uintx result; 1088 if (GetVMFlag <uintx> (thread, env, name, &result, &JVMFlag::uintxAt)) { 1089 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI 1090 return longBox(thread, env, result); 1091 } 1092 return NULL; 1093 WB_END 1094 1095 WB_ENTRY(jobject, WB_GetUint64VMFlag(JNIEnv* env, jobject o, jstring name)) 1096 uint64_t result; 1097 if (GetVMFlag <uint64_t> (thread, env, name, &result, &JVMFlag::uint64_tAt)) { 1098 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI 1099 return longBox(thread, env, result); 1100 } 1101 return NULL; 1102 WB_END 1103 1104 WB_ENTRY(jobject, WB_GetSizeTVMFlag(JNIEnv* env, jobject o, jstring name)) 1105 uintx result; 1106 if (GetVMFlag <size_t> (thread, env, name, &result, &JVMFlag::size_tAt)) { 1107 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI 1108 return longBox(thread, env, result); 1109 } 1110 return NULL; 1111 WB_END 1112 1113 WB_ENTRY(jobject, WB_GetDoubleVMFlag(JNIEnv* env, jobject o, jstring name)) 1114 double result; 1115 if (GetVMFlag <double> (thread, env, name, &result, &JVMFlag::doubleAt)) { 1116 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI 1117 return doubleBox(thread, env, result); 1118 } 1119 return NULL; 1120 WB_END 1121 1122 WB_ENTRY(jstring, WB_GetStringVMFlag(JNIEnv* env, jobject o, jstring name)) 1123 ccstr ccstrResult; 1124 if (GetVMFlag <ccstr> (thread, env, name, &ccstrResult, &JVMFlag::ccstrAt)) { 1125 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI 1126 jstring result = env->NewStringUTF(ccstrResult); 1127 CHECK_JNI_EXCEPTION_(env, NULL); 1128 return result; 1129 } 1130 return NULL; 1131 WB_END 1132 1133 WB_ENTRY(void, WB_SetBooleanVMFlag(JNIEnv* env, jobject o, jstring name, jboolean value)) 1134 bool result = value == JNI_TRUE ? true : false; 1135 SetVMFlag <bool> (thread, env, name, &result, &JVMFlag::boolAtPut); 1136 WB_END 1137 1138 WB_ENTRY(void, WB_SetIntVMFlag(JNIEnv* env, jobject o, jstring name, jlong value)) 1139 int result = value; 1140 SetVMFlag <int> (thread, env, name, &result, &JVMFlag::intAtPut); 1141 WB_END 1142 1143 WB_ENTRY(void, WB_SetUintVMFlag(JNIEnv* env, jobject o, jstring name, jlong value)) 1144 uint result = value; 1145 SetVMFlag <uint> (thread, env, name, &result, &JVMFlag::uintAtPut); 1146 WB_END 1147 1148 WB_ENTRY(void, WB_SetIntxVMFlag(JNIEnv* env, jobject o, jstring name, jlong value)) 1149 intx result = value; 1150 SetVMFlag <intx> (thread, env, name, &result, &JVMFlag::intxAtPut); 1151 WB_END 1152 1153 WB_ENTRY(void, WB_SetUintxVMFlag(JNIEnv* env, jobject o, jstring name, jlong value)) 1154 uintx result = value; 1155 SetVMFlag <uintx> (thread, env, name, &result, &JVMFlag::uintxAtPut); 1156 WB_END 1157 1158 WB_ENTRY(void, WB_SetUint64VMFlag(JNIEnv* env, jobject o, jstring name, jlong value)) 1159 uint64_t result = value; 1160 SetVMFlag <uint64_t> (thread, env, name, &result, &JVMFlag::uint64_tAtPut); 1161 WB_END 1162 1163 WB_ENTRY(void, WB_SetSizeTVMFlag(JNIEnv* env, jobject o, jstring name, jlong value)) 1164 size_t result = value; 1165 SetVMFlag <size_t> (thread, env, name, &result, &JVMFlag::size_tAtPut); 1166 WB_END 1167 1168 WB_ENTRY(void, WB_SetDoubleVMFlag(JNIEnv* env, jobject o, jstring name, jdouble value)) 1169 double result = value; 1170 SetVMFlag <double> (thread, env, name, &result, &JVMFlag::doubleAtPut); 1171 WB_END 1172 1173 WB_ENTRY(void, WB_SetStringVMFlag(JNIEnv* env, jobject o, jstring name, jstring value)) 1174 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI 1175 const char* ccstrValue; 1176 if (value == NULL) { 1177 ccstrValue = NULL; 1178 } 1179 else { 1180 ccstrValue = env->GetStringUTFChars(value, NULL); 1181 CHECK_JNI_EXCEPTION(env); 1182 } 1183 ccstr ccstrResult = ccstrValue; 1184 bool needFree; 1185 { 1186 ThreadInVMfromNative ttvfn(thread); // back to VM 1187 needFree = SetVMFlag <ccstr> (thread, env, name, &ccstrResult, &JVMFlag::ccstrAtPut); 1188 } 1189 if (value != NULL) { 1190 env->ReleaseStringUTFChars(value, ccstrValue); 1191 } 1192 if (needFree) { 1193 FREE_C_HEAP_ARRAY(char, ccstrResult); 1194 } 1195 WB_END 1196 1197 WB_ENTRY(void, WB_LockCompilation(JNIEnv* env, jobject o, jlong timeout)) 1198 WhiteBox::compilation_locked = true; 1199 WB_END 1200 1201 WB_ENTRY(void, WB_UnlockCompilation(JNIEnv* env, jobject o)) 1202 MonitorLockerEx mo(Compilation_lock, Mutex::_no_safepoint_check_flag); 1203 WhiteBox::compilation_locked = false; 1204 mo.notify_all(); 1205 WB_END 1206 1207 WB_ENTRY(void, WB_ForceNMethodSweep(JNIEnv* env, jobject o)) |