comparison src/share/vm/oops/methodOop.cpp @ 2226:c5a923563727

6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?") Summary: Fix block_size_if_printezis_bits() so it does not expect the bits, only uses them when available. Fix block_size_no_stall() so it does not stall when the bits are missing such cases, letting the caller deal with zero size returns. Constant pool cache oops do not need to be unparsable or conc_unsafe after their klass pointer is installed. Some cosmetic clean-ups and some assertion checking for conc-usafety which, in the presence of class file redefinition, has no a-priori time boundedness, so all GCs must be able to safely deal with putatively conc-unsafe objects in a stop-world pause. Reviewed-by: jmasa, johnc
author ysr
date Mon, 07 Feb 2011 22:19:57 -0800
parents 3582bf76420e
children f77b3ec064b0
comparison
equal deleted inserted replaced
2225:c798c277ddd1 2226:c5a923563727
983 localvariable_len, 983 localvariable_len,
984 checked_exceptions_len, 984 checked_exceptions_len,
985 IsUnsafeConc, 985 IsUnsafeConc,
986 CHECK_(methodHandle())); 986 CHECK_(methodHandle()));
987 methodHandle newm (THREAD, newm_oop); 987 methodHandle newm (THREAD, newm_oop);
988 NOT_PRODUCT(int nmsz = newm->is_parsable() ? newm->size() : -1;)
988 int new_method_size = newm->method_size(); 989 int new_method_size = newm->method_size();
989 // Create a shallow copy of methodOopDesc part, but be careful to preserve the new constMethodOop 990 // Create a shallow copy of methodOopDesc part, but be careful to preserve the new constMethodOop
990 constMethodOop newcm = newm->constMethod(); 991 constMethodOop newcm = newm->constMethod();
992 NOT_PRODUCT(int ncmsz = newcm->is_parsable() ? newcm->size() : -1;)
991 int new_const_method_size = newm->constMethod()->object_size(); 993 int new_const_method_size = newm->constMethod()->object_size();
992 994
993 memcpy(newm(), m(), sizeof(methodOopDesc)); 995 memcpy(newm(), m(), sizeof(methodOopDesc));
994 // Create shallow copy of constMethodOopDesc, but be careful to preserve the methodOop 996 // Create shallow copy of constMethodOopDesc, but be careful to preserve the methodOop
995 // is_conc_safe is set to false because that is the value of 997 // is_conc_safe is set to false because that is the value of
997 // not overwrite that value. During the window during which it is 999 // not overwrite that value. During the window during which it is
998 // tagged as unsafe, some extra work could be needed during precleaning 1000 // tagged as unsafe, some extra work could be needed during precleaning
999 // or concurrent marking but those phases will be correct. Setting and 1001 // or concurrent marking but those phases will be correct. Setting and
1000 // resetting is done in preference to a careful copying into newcm to 1002 // resetting is done in preference to a careful copying into newcm to
1001 // avoid having to know the precise layout of a constMethodOop. 1003 // avoid having to know the precise layout of a constMethodOop.
1002 m->constMethod()->set_is_conc_safe(false); 1004 m->constMethod()->set_is_conc_safe(oopDesc::IsUnsafeConc);
1005 assert(m->constMethod()->is_parsable(), "Should remain parsable");
1006
1007 // NOTE: this is a reachable object that transiently signals "conc_unsafe"
1008 // However, no allocations are done during this window
1009 // during which it is tagged conc_unsafe, so we are assured that any concurrent
1010 // thread will not wait forever for the object to revert to "conc_safe".
1011 // Further, any such conc_unsafe object will indicate a stable size
1012 // through the transition.
1003 memcpy(newcm, m->constMethod(), sizeof(constMethodOopDesc)); 1013 memcpy(newcm, m->constMethod(), sizeof(constMethodOopDesc));
1004 m->constMethod()->set_is_conc_safe(true); 1014 m->constMethod()->set_is_conc_safe(oopDesc::IsSafeConc);
1015 assert(m->constMethod()->is_parsable(), "Should remain parsable");
1016
1005 // Reset correct method/const method, method size, and parameter info 1017 // Reset correct method/const method, method size, and parameter info
1006 newcm->set_method(newm()); 1018 newcm->set_method(newm());
1007 newm->set_constMethod(newcm); 1019 newm->set_constMethod(newcm);
1008 assert(newcm->method() == newm(), "check"); 1020 assert(newcm->method() == newm(), "check");
1009 newm->constMethod()->set_code_size(new_code_length); 1021 newm->constMethod()->set_code_size(new_code_length);
1033 localvariable_len * sizeof(LocalVariableTableElement)); 1045 localvariable_len * sizeof(LocalVariableTableElement));
1034 } 1046 }
1035 1047
1036 // Only set is_conc_safe to true when changes to newcm are 1048 // Only set is_conc_safe to true when changes to newcm are
1037 // complete. 1049 // complete.
1050 assert(!newm->is_parsable() || nmsz < 0 || newm->size() == nmsz, "newm->size() inconsistency");
1051 assert(!newcm->is_parsable() || ncmsz < 0 || newcm->size() == ncmsz, "newcm->size() inconsistency");
1038 newcm->set_is_conc_safe(true); 1052 newcm->set_is_conc_safe(true);
1039 return newm; 1053 return newm;
1040 } 1054 }
1041 1055
1042 vmSymbols::SID methodOopDesc::klass_id_for_intrinsics(klassOop holder) { 1056 vmSymbols::SID methodOopDesc::klass_id_for_intrinsics(klassOop holder) {