Mercurial > hg > truffle
comparison src/share/vm/oops/methodOop.cpp @ 518:0af8b0718fc9
6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
Summary: The CMS concurrent precleaning and concurrent marking phases should work around classes that are undergoing redefinition.
Reviewed-by: ysr, dcubed
author | jmasa |
---|---|
date | Sun, 11 Jan 2009 16:58:24 -0800 |
parents | d1605aabd0a1 |
children | 0fbdb4381b99 |
comparison
equal
deleted
inserted
replaced
517:e9be0e04635a | 518:0af8b0718fc9 |
---|---|
790 assert(!m->is_native(), "cannot rewrite native methods"); | 790 assert(!m->is_native(), "cannot rewrite native methods"); |
791 // Allocate new methodOop | 791 // Allocate new methodOop |
792 AccessFlags flags = m->access_flags(); | 792 AccessFlags flags = m->access_flags(); |
793 int checked_exceptions_len = m->checked_exceptions_length(); | 793 int checked_exceptions_len = m->checked_exceptions_length(); |
794 int localvariable_len = m->localvariable_table_length(); | 794 int localvariable_len = m->localvariable_table_length(); |
795 methodOop newm_oop = oopFactory::new_method(new_code_length, flags, new_compressed_linenumber_size, localvariable_len, checked_exceptions_len, CHECK_(methodHandle())); | 795 // Allocate newm_oop with the is_conc_safe parameter set |
796 // to IsUnsafeConc to indicate that newm_oop is not yet | |
797 // safe for concurrent processing by a GC. | |
798 methodOop newm_oop = oopFactory::new_method(new_code_length, | |
799 flags, | |
800 new_compressed_linenumber_size, | |
801 localvariable_len, | |
802 checked_exceptions_len, | |
803 IsUnsafeConc, | |
804 CHECK_(methodHandle())); | |
796 methodHandle newm (THREAD, newm_oop); | 805 methodHandle newm (THREAD, newm_oop); |
797 int new_method_size = newm->method_size(); | 806 int new_method_size = newm->method_size(); |
798 // Create a shallow copy of methodOopDesc part, but be careful to preserve the new constMethodOop | 807 // Create a shallow copy of methodOopDesc part, but be careful to preserve the new constMethodOop |
799 constMethodOop newcm = newm->constMethod(); | 808 constMethodOop newcm = newm->constMethod(); |
800 int new_const_method_size = newm->constMethod()->object_size(); | 809 int new_const_method_size = newm->constMethod()->object_size(); |
810 | |
801 memcpy(newm(), m(), sizeof(methodOopDesc)); | 811 memcpy(newm(), m(), sizeof(methodOopDesc)); |
802 // Create shallow copy of constMethodOopDesc, but be careful to preserve the methodOop | 812 // Create shallow copy of constMethodOopDesc, but be careful to preserve the methodOop |
813 // is_conc_safe is set to false because that is the value of | |
814 // is_conc_safe initialzied into newcm and the copy should | |
815 // not overwrite that value. During the window during which it is | |
816 // tagged as unsafe, some extra work could be needed during precleaning | |
817 // or concurrent marking but those phases will be correct. Setting and | |
818 // resetting is done in preference to a careful copying into newcm to | |
819 // avoid having to know the precise layout of a constMethodOop. | |
820 m->constMethod()->set_is_conc_safe(false); | |
803 memcpy(newcm, m->constMethod(), sizeof(constMethodOopDesc)); | 821 memcpy(newcm, m->constMethod(), sizeof(constMethodOopDesc)); |
822 m->constMethod()->set_is_conc_safe(true); | |
804 // Reset correct method/const method, method size, and parameter info | 823 // Reset correct method/const method, method size, and parameter info |
805 newcm->set_method(newm()); | 824 newcm->set_method(newm()); |
806 newm->set_constMethod(newcm); | 825 newm->set_constMethod(newcm); |
807 assert(newcm->method() == newm(), "check"); | 826 assert(newcm->method() == newm(), "check"); |
808 newm->constMethod()->set_code_size(new_code_length); | 827 newm->constMethod()->set_code_size(new_code_length); |
829 if (localvariable_len > 0) { | 848 if (localvariable_len > 0) { |
830 memcpy(newm->localvariable_table_start(), | 849 memcpy(newm->localvariable_table_start(), |
831 m->localvariable_table_start(), | 850 m->localvariable_table_start(), |
832 localvariable_len * sizeof(LocalVariableTableElement)); | 851 localvariable_len * sizeof(LocalVariableTableElement)); |
833 } | 852 } |
853 | |
854 // Only set is_conc_safe to true when changes to newcm are | |
855 // complete. | |
856 newcm->set_is_conc_safe(true); | |
834 return newm; | 857 return newm; |
835 } | 858 } |
836 | 859 |
837 vmIntrinsics::ID methodOopDesc::compute_intrinsic_id() const { | 860 vmIntrinsics::ID methodOopDesc::compute_intrinsic_id() const { |
838 assert(vmIntrinsics::_none == 0, "correct coding of default case"); | 861 assert(vmIntrinsics::_none == 0, "correct coding of default case"); |