938 |
938 |
939 // return number of elements we at leasted wanted to initialize |
939 // return number of elements we at leasted wanted to initialize |
940 return rfill + overflow; |
940 return rfill + overflow; |
941 } |
941 } |
942 |
942 |
|
943 // Get context class for a CallSite instance: either extract existing context or use default one. |
|
944 InstanceKlass* MethodHandles::get_call_site_context(oop call_site) { |
|
945 // In order to extract a context the following traversal is performed: |
|
946 // CallSite.context => Cleaner.referent => Class._klass => Klass |
|
947 assert(java_lang_invoke_CallSite::is_instance(call_site), ""); |
|
948 oop context_oop = java_lang_invoke_CallSite::context_volatile(call_site); |
|
949 if (oopDesc::is_null(context_oop)) { |
|
950 return NULL; // The context hasn't been initialized yet. |
|
951 } |
|
952 oop context_class_oop = java_lang_ref_Reference::referent(context_oop); |
|
953 if (oopDesc::is_null(context_class_oop)) { |
|
954 // The context reference was cleared by GC, so current dependency context |
|
955 // isn't usable anymore. Context should be fetched from CallSite again. |
|
956 return NULL; |
|
957 } |
|
958 return InstanceKlass::cast(java_lang_Class::as_Klass(context_class_oop)); |
|
959 } |
|
960 |
943 //------------------------------------------------------------------------------ |
961 //------------------------------------------------------------------------------ |
944 // MemberNameTable |
962 // MemberNameTable |
945 // |
963 // |
946 |
964 |
947 MemberNameTable::MemberNameTable(int methods_cnt) |
965 MemberNameTable::MemberNameTable(int methods_cnt) |
1250 } |
1268 } |
1251 JVM_END |
1269 JVM_END |
1252 |
1270 |
1253 JVM_ENTRY(void, MHN_setCallSiteTargetNormal(JNIEnv* env, jobject igcls, jobject call_site_jh, jobject target_jh)) { |
1271 JVM_ENTRY(void, MHN_setCallSiteTargetNormal(JNIEnv* env, jobject igcls, jobject call_site_jh, jobject target_jh)) { |
1254 Handle call_site(THREAD, JNIHandles::resolve_non_null(call_site_jh)); |
1272 Handle call_site(THREAD, JNIHandles::resolve_non_null(call_site_jh)); |
1255 Handle target (THREAD, JNIHandles::resolve(target_jh)); |
1273 Handle target (THREAD, JNIHandles::resolve_non_null(target_jh)); |
1256 { |
1274 { |
1257 // Walk all nmethods depending on this call site. |
1275 // Walk all nmethods depending on this call site. |
1258 MutexLocker mu(Compile_lock, thread); |
1276 MutexLocker mu(Compile_lock, thread); |
1259 CodeCache::flush_dependents_on(call_site, target); |
1277 CodeCache::flush_dependents_on(call_site, target); |
1260 java_lang_invoke_CallSite::set_target(call_site(), target()); |
1278 java_lang_invoke_CallSite::set_target(call_site(), target()); |
1262 } |
1280 } |
1263 JVM_END |
1281 JVM_END |
1264 |
1282 |
1265 JVM_ENTRY(void, MHN_setCallSiteTargetVolatile(JNIEnv* env, jobject igcls, jobject call_site_jh, jobject target_jh)) { |
1283 JVM_ENTRY(void, MHN_setCallSiteTargetVolatile(JNIEnv* env, jobject igcls, jobject call_site_jh, jobject target_jh)) { |
1266 Handle call_site(THREAD, JNIHandles::resolve_non_null(call_site_jh)); |
1284 Handle call_site(THREAD, JNIHandles::resolve_non_null(call_site_jh)); |
1267 Handle target (THREAD, JNIHandles::resolve(target_jh)); |
1285 Handle target (THREAD, JNIHandles::resolve_non_null(target_jh)); |
1268 { |
1286 { |
1269 // Walk all nmethods depending on this call site. |
1287 // Walk all nmethods depending on this call site. |
1270 MutexLocker mu(Compile_lock, thread); |
1288 MutexLocker mu(Compile_lock, thread); |
1271 CodeCache::flush_dependents_on(call_site, target); |
1289 CodeCache::flush_dependents_on(call_site, target); |
1272 java_lang_invoke_CallSite::set_target_volatile(call_site(), target()); |
1290 java_lang_invoke_CallSite::set_target_volatile(call_site(), target()); |
|
1291 } |
|
1292 } |
|
1293 JVM_END |
|
1294 |
|
1295 JVM_ENTRY(void, MHN_invalidateDependentNMethods(JNIEnv* env, jobject igcls, jobject call_site_jh)) { |
|
1296 Handle call_site(THREAD, JNIHandles::resolve_non_null(call_site_jh)); |
|
1297 { |
|
1298 // Walk all nmethods depending on this call site. |
|
1299 MutexLocker mu1(Compile_lock, thread); |
|
1300 |
|
1301 CallSiteDepChange changes(call_site(), Handle()); |
|
1302 |
|
1303 InstanceKlass* ctxk = MethodHandles::get_call_site_context(call_site()); |
|
1304 if (ctxk == NULL) { |
|
1305 return; // No dependencies to invalidate yet. |
|
1306 } |
|
1307 int marked = 0; |
|
1308 { |
|
1309 MutexLockerEx mu2(CodeCache_lock, Mutex::_no_safepoint_check_flag); |
|
1310 marked = ctxk->mark_dependent_nmethods(changes); |
|
1311 } |
|
1312 java_lang_invoke_CallSite::set_context_volatile(call_site(), NULL); // Reset call site to initial state |
|
1313 if (marked > 0) { |
|
1314 // At least one nmethod has been marked for deoptimization |
|
1315 VM_Deoptimize op; |
|
1316 VMThread::execute(&op); |
|
1317 } |
1273 } |
1318 } |
1274 } |
1319 } |
1275 JVM_END |
1320 JVM_END |
1276 |
1321 |
1277 /** |
1322 /** |
1325 // int matchFlags, Class<?> caller, int skip, MemberName[] results); |
1370 // int matchFlags, Class<?> caller, int skip, MemberName[] results); |
1326 {CC"getMembers", CC"("CLS""STRG""STRG"I"CLS"I["MEM")I", FN_PTR(MHN_getMembers)}, |
1371 {CC"getMembers", CC"("CLS""STRG""STRG"I"CLS"I["MEM")I", FN_PTR(MHN_getMembers)}, |
1327 {CC"objectFieldOffset", CC"("MEM")J", FN_PTR(MHN_objectFieldOffset)}, |
1372 {CC"objectFieldOffset", CC"("MEM")J", FN_PTR(MHN_objectFieldOffset)}, |
1328 {CC"setCallSiteTargetNormal", CC"("CS""MH")V", FN_PTR(MHN_setCallSiteTargetNormal)}, |
1373 {CC"setCallSiteTargetNormal", CC"("CS""MH")V", FN_PTR(MHN_setCallSiteTargetNormal)}, |
1329 {CC"setCallSiteTargetVolatile", CC"("CS""MH")V", FN_PTR(MHN_setCallSiteTargetVolatile)}, |
1374 {CC"setCallSiteTargetVolatile", CC"("CS""MH")V", FN_PTR(MHN_setCallSiteTargetVolatile)}, |
|
1375 {CC"invalidateDependentNMethods", CC"("CS")V", FN_PTR(MHN_invalidateDependentNMethods)}, |
1330 {CC"staticFieldOffset", CC"("MEM")J", FN_PTR(MHN_staticFieldOffset)}, |
1376 {CC"staticFieldOffset", CC"("MEM")J", FN_PTR(MHN_staticFieldOffset)}, |
1331 {CC"staticFieldBase", CC"("MEM")"OBJ, FN_PTR(MHN_staticFieldBase)}, |
1377 {CC"staticFieldBase", CC"("MEM")"OBJ, FN_PTR(MHN_staticFieldBase)}, |
1332 {CC"getMemberVMInfo", CC"("MEM")"OBJ, FN_PTR(MHN_getMemberVMInfo)} |
1378 {CC"getMemberVMInfo", CC"("MEM")"OBJ, FN_PTR(MHN_getMemberVMInfo)} |
1333 }; |
1379 }; |
1334 |
1380 |