964 // in order to avoid memory leak, stale entries are purged whenever a dependency list
965 // is changed (both on addition and removal). Though memory reclamation is delayed,
966 // it avoids indefinite memory usage growth.
967 deps.add_dependent_nmethod(nm, /*expunge_stale_entries=*/safe_to_expunge());
968 }
969
970 void MethodHandles::remove_dependent_nmethod(oop call_site, nmethod* nm) {
971 assert_locked_or_safepoint(CodeCache_lock);
972
973 oop context = java_lang_invoke_CallSite::context(call_site);
974 DependencyContext deps = java_lang_invoke_MethodHandleNatives_CallSiteContext::vmdependencies(context);
975 deps.remove_dependent_nmethod(nm, /*expunge_stale_entries=*/safe_to_expunge());
976 }
977
978 void MethodHandles::flush_dependent_nmethods(Handle call_site, Handle target) {
979 assert_lock_strong(Compile_lock);
980
981 int marked = 0;
982 CallSiteDepChange changes(call_site(), target());
983 {
984 No_Safepoint_Verifier nsv;
985 MutexLockerEx mu2(CodeCache_lock, Mutex::_no_safepoint_check_flag);
986
987 oop context = java_lang_invoke_CallSite::context(call_site());
988 DependencyContext deps = java_lang_invoke_MethodHandleNatives_CallSiteContext::vmdependencies(context);
989 marked = deps.mark_dependent_nmethods(changes);
990 }
991 if (marked > 0) {
992 // At least one nmethod has been marked for deoptimization.
993 VM_Deoptimize op;
994 VMThread::execute(&op);
995 }
996 }
997
998 //------------------------------------------------------------------------------
999 // MemberNameTable
1000 //
1001
1002 MemberNameTable::MemberNameTable(int methods_cnt)
1003 : GrowableArray<jweak>(methods_cnt, true) {
1004 assert_locked_or_safepoint(MemberNameTable_lock);
1322 Handle target (THREAD, JNIHandles::resolve_non_null(target_jh));
1323 {
1324 // Walk all nmethods depending on this call site.
1325 MutexLocker mu(Compile_lock, thread);
1326 MethodHandles::flush_dependent_nmethods(call_site, target);
1327 java_lang_invoke_CallSite::set_target_volatile(call_site(), target());
1328 }
1329 }
1330 JVM_END
1331
1332 // It is called by a Cleaner object which ensures that dropped CallSites properly
1333 // deallocate their dependency information.
1334 JVM_ENTRY(void, MHN_clearCallSiteContext(JNIEnv* env, jobject igcls, jobject context_jh)) {
1335 Handle context(THREAD, JNIHandles::resolve_non_null(context_jh));
1336 {
1337 // Walk all nmethods depending on this call site.
1338 MutexLocker mu1(Compile_lock, thread);
1339
1340 int marked = 0;
1341 {
1342 No_Safepoint_Verifier nsv;
1343 MutexLockerEx mu2(CodeCache_lock, Mutex::_no_safepoint_check_flag);
1344 assert(safe_to_expunge(), "removal is not safe");
1345 DependencyContext deps = java_lang_invoke_MethodHandleNatives_CallSiteContext::vmdependencies(context());
1346 marked = deps.remove_all_dependents();
1347 }
1348 if (marked > 0) {
1349 // At least one nmethod has been marked for deoptimization
1350 VM_Deoptimize op;
1351 VMThread::execute(&op);
1352 }
1353 }
1354 }
1355 JVM_END
1356
1357 /**
1358 * Throws a java/lang/UnsupportedOperationException unconditionally.
1359 * This is required by the specification of MethodHandle.invoke if
1360 * invoked directly.
1361 */
1362 JVM_ENTRY(jobject, MH_invoke_UOE(JNIEnv* env, jobject mh, jobjectArray args)) {
|
964 // in order to avoid memory leak, stale entries are purged whenever a dependency list
965 // is changed (both on addition and removal). Though memory reclamation is delayed,
966 // it avoids indefinite memory usage growth.
967 deps.add_dependent_nmethod(nm, /*expunge_stale_entries=*/safe_to_expunge());
968 }
969
970 void MethodHandles::remove_dependent_nmethod(oop call_site, nmethod* nm) {
971 assert_locked_or_safepoint(CodeCache_lock);
972
973 oop context = java_lang_invoke_CallSite::context(call_site);
974 DependencyContext deps = java_lang_invoke_MethodHandleNatives_CallSiteContext::vmdependencies(context);
975 deps.remove_dependent_nmethod(nm, /*expunge_stale_entries=*/safe_to_expunge());
976 }
977
978 void MethodHandles::flush_dependent_nmethods(Handle call_site, Handle target) {
979 assert_lock_strong(Compile_lock);
980
981 int marked = 0;
982 CallSiteDepChange changes(call_site(), target());
983 {
984 NoSafepointVerifier nsv;
985 MutexLockerEx mu2(CodeCache_lock, Mutex::_no_safepoint_check_flag);
986
987 oop context = java_lang_invoke_CallSite::context(call_site());
988 DependencyContext deps = java_lang_invoke_MethodHandleNatives_CallSiteContext::vmdependencies(context);
989 marked = deps.mark_dependent_nmethods(changes);
990 }
991 if (marked > 0) {
992 // At least one nmethod has been marked for deoptimization.
993 VM_Deoptimize op;
994 VMThread::execute(&op);
995 }
996 }
997
998 //------------------------------------------------------------------------------
999 // MemberNameTable
1000 //
1001
1002 MemberNameTable::MemberNameTable(int methods_cnt)
1003 : GrowableArray<jweak>(methods_cnt, true) {
1004 assert_locked_or_safepoint(MemberNameTable_lock);
1322 Handle target (THREAD, JNIHandles::resolve_non_null(target_jh));
1323 {
1324 // Walk all nmethods depending on this call site.
1325 MutexLocker mu(Compile_lock, thread);
1326 MethodHandles::flush_dependent_nmethods(call_site, target);
1327 java_lang_invoke_CallSite::set_target_volatile(call_site(), target());
1328 }
1329 }
1330 JVM_END
1331
1332 // It is called by a Cleaner object which ensures that dropped CallSites properly
1333 // deallocate their dependency information.
1334 JVM_ENTRY(void, MHN_clearCallSiteContext(JNIEnv* env, jobject igcls, jobject context_jh)) {
1335 Handle context(THREAD, JNIHandles::resolve_non_null(context_jh));
1336 {
1337 // Walk all nmethods depending on this call site.
1338 MutexLocker mu1(Compile_lock, thread);
1339
1340 int marked = 0;
1341 {
1342 NoSafepointVerifier nsv;
1343 MutexLockerEx mu2(CodeCache_lock, Mutex::_no_safepoint_check_flag);
1344 assert(safe_to_expunge(), "removal is not safe");
1345 DependencyContext deps = java_lang_invoke_MethodHandleNatives_CallSiteContext::vmdependencies(context());
1346 marked = deps.remove_all_dependents();
1347 }
1348 if (marked > 0) {
1349 // At least one nmethod has been marked for deoptimization
1350 VM_Deoptimize op;
1351 VMThread::execute(&op);
1352 }
1353 }
1354 }
1355 JVM_END
1356
1357 /**
1358 * Throws a java/lang/UnsupportedOperationException unconditionally.
1359 * This is required by the specification of MethodHandle.invoke if
1360 * invoked directly.
1361 */
1362 JVM_ENTRY(jobject, MH_invoke_UOE(JNIEnv* env, jobject mh, jobjectArray args)) {
|