< prev index next >

src/share/vm/prims/methodHandles.cpp

Print this page




 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)) {


< prev index next >