715 f->do_code_blob(cur);
716 }
717 nmethod* const next = cur->scavenge_root_link();
718 // The scavengable nmethod list must contain all methods with scavengable
719 // oops. It is safe to include more nmethod on the list, but we do not
720 // expect any live non-scavengable nmethods on the list.
721 if (fix_relocations) {
722 if (!is_live || !cur->detect_scavenge_root_oops()) {
723 unlink_scavenge_root_nmethod(cur, prev);
724 } else {
725 prev = cur;
726 }
727 }
728 cur = next;
729 }
730
731 // Check for stray marks.
732 debug_only(verify_perm_nmethods(NULL));
733 }
734
735 void CodeCache::add_scavenge_root_nmethod(nmethod* nm) {
736 assert_locked_or_safepoint(CodeCache_lock);
737
738 nm->set_on_scavenge_root_list();
739 nm->set_scavenge_root_link(_scavenge_root_nmethods);
740 set_scavenge_root_nmethods(nm);
741 print_trace("add_scavenge_root", nm);
742 }
743
744 void CodeCache::unlink_scavenge_root_nmethod(nmethod* nm, nmethod* prev) {
745 assert_locked_or_safepoint(CodeCache_lock);
746
747 assert((prev == NULL && scavenge_root_nmethods() == nm) ||
748 (prev != NULL && prev->scavenge_root_link() == nm), "precondition");
749
750 print_trace("unlink_scavenge_root", nm);
751 if (prev == NULL) {
752 set_scavenge_root_nmethods(nm->scavenge_root_link());
753 } else {
754 prev->set_scavenge_root_link(nm->scavenge_root_link());
|
715 f->do_code_blob(cur);
716 }
717 nmethod* const next = cur->scavenge_root_link();
718 // The scavengable nmethod list must contain all methods with scavengable
719 // oops. It is safe to include more nmethod on the list, but we do not
720 // expect any live non-scavengable nmethods on the list.
721 if (fix_relocations) {
722 if (!is_live || !cur->detect_scavenge_root_oops()) {
723 unlink_scavenge_root_nmethod(cur, prev);
724 } else {
725 prev = cur;
726 }
727 }
728 cur = next;
729 }
730
731 // Check for stray marks.
732 debug_only(verify_perm_nmethods(NULL));
733 }
734
735 void CodeCache::register_scavenge_root_nmethod(nmethod* nm) {
736 assert_locked_or_safepoint(CodeCache_lock);
737 if (!nm->on_scavenge_root_list() && nm->detect_scavenge_root_oops()) {
738 add_scavenge_root_nmethod(nm);
739 }
740 }
741
742 void CodeCache::add_scavenge_root_nmethod(nmethod* nm) {
743 assert_locked_or_safepoint(CodeCache_lock);
744
745 nm->set_on_scavenge_root_list();
746 nm->set_scavenge_root_link(_scavenge_root_nmethods);
747 set_scavenge_root_nmethods(nm);
748 print_trace("add_scavenge_root", nm);
749 }
750
751 void CodeCache::unlink_scavenge_root_nmethod(nmethod* nm, nmethod* prev) {
752 assert_locked_or_safepoint(CodeCache_lock);
753
754 assert((prev == NULL && scavenge_root_nmethods() == nm) ||
755 (prev != NULL && prev->scavenge_root_link() == nm), "precondition");
756
757 print_trace("unlink_scavenge_root", nm);
758 if (prev == NULL) {
759 set_scavenge_root_nmethods(nm->scavenge_root_link());
760 } else {
761 prev->set_scavenge_root_link(nm->scavenge_root_link());
|