src/share/vm/oops/instanceRefKlass.cpp

changeset 777
37f87013dfd8
parent 548
ba764ed4b6f2
child 791
1ee8caae33af
equal deleted inserted replaced
624:0b27f3512f9e 777:37f87013dfd8
174 } 174 }
175 return size; 175 return size;
176 } 176 }
177 177
178 #define InstanceRefKlass_SPECIALIZED_OOP_ITERATE(T, nv_suffix, contains) \ 178 #define InstanceRefKlass_SPECIALIZED_OOP_ITERATE(T, nv_suffix, contains) \
179 if (closure->apply_to_weak_ref_discovered_field()) { \
180 T* disc_addr = (T*)java_lang_ref_Reference::discovered_addr(obj); \
181 closure->do_oop##nv_suffix(disc_addr); \
182 } \
183 \
179 T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj); \ 184 T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj); \
180 oop referent = oopDesc::load_decode_heap_oop(referent_addr); \ 185 oop referent = oopDesc::load_decode_heap_oop(referent_addr); \
181 if (referent != NULL && contains(referent_addr)) { \ 186 if (referent != NULL && contains(referent_addr)) { \
182 ReferenceProcessor* rp = closure->_ref_processor; \ 187 ReferenceProcessor* rp = closure->_ref_processor; \
183 if (!referent->is_gc_marked() && (rp != NULL) && \ 188 if (!referent->is_gc_marked() && (rp != NULL) && \
217 } else { \ 222 } else { \
218 InstanceRefKlass_SPECIALIZED_OOP_ITERATE(oop, nv_suffix, contains); \ 223 InstanceRefKlass_SPECIALIZED_OOP_ITERATE(oop, nv_suffix, contains); \
219 } \ 224 } \
220 } 225 }
221 226
227 #ifndef SERIALGC
228 #define InstanceRefKlass_OOP_OOP_ITERATE_BACKWARDS_DEFN(OopClosureType, nv_suffix) \
229 \
230 int instanceRefKlass:: \
231 oop_oop_iterate_backwards##nv_suffix(oop obj, OopClosureType* closure) { \
232 /* Get size before changing pointers */ \
233 SpecializationStats::record_iterate_call##nv_suffix(SpecializationStats::irk);\
234 \
235 int size = instanceKlass::oop_oop_iterate_backwards##nv_suffix(obj, closure); \
236 \
237 if (UseCompressedOops) { \
238 InstanceRefKlass_SPECIALIZED_OOP_ITERATE(narrowOop, nv_suffix, contains); \
239 } else { \
240 InstanceRefKlass_SPECIALIZED_OOP_ITERATE(oop, nv_suffix, contains); \
241 } \
242 }
243 #endif // !SERIALGC
244
245
222 #define InstanceRefKlass_OOP_OOP_ITERATE_DEFN_m(OopClosureType, nv_suffix) \ 246 #define InstanceRefKlass_OOP_OOP_ITERATE_DEFN_m(OopClosureType, nv_suffix) \
223 \ 247 \
224 int instanceRefKlass:: \ 248 int instanceRefKlass:: \
225 oop_oop_iterate##nv_suffix##_m(oop obj, \ 249 oop_oop_iterate##nv_suffix##_m(oop obj, \
226 OopClosureType* closure, \ 250 OopClosureType* closure, \
234 InstanceRefKlass_SPECIALIZED_OOP_ITERATE(oop, nv_suffix, mr.contains); \ 258 InstanceRefKlass_SPECIALIZED_OOP_ITERATE(oop, nv_suffix, mr.contains); \
235 } \ 259 } \
236 } 260 }
237 261
238 ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceRefKlass_OOP_OOP_ITERATE_DEFN) 262 ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceRefKlass_OOP_OOP_ITERATE_DEFN)
239 ALL_OOP_OOP_ITERATE_CLOSURES_3(InstanceRefKlass_OOP_OOP_ITERATE_DEFN) 263 ALL_OOP_OOP_ITERATE_CLOSURES_2(InstanceRefKlass_OOP_OOP_ITERATE_DEFN)
264 #ifndef SERIALGC
265 ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceRefKlass_OOP_OOP_ITERATE_BACKWARDS_DEFN)
266 ALL_OOP_OOP_ITERATE_CLOSURES_2(InstanceRefKlass_OOP_OOP_ITERATE_BACKWARDS_DEFN)
267 #endif // SERIALGC
240 ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceRefKlass_OOP_OOP_ITERATE_DEFN_m) 268 ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceRefKlass_OOP_OOP_ITERATE_DEFN_m)
241 ALL_OOP_OOP_ITERATE_CLOSURES_3(InstanceRefKlass_OOP_OOP_ITERATE_DEFN_m) 269 ALL_OOP_OOP_ITERATE_CLOSURES_2(InstanceRefKlass_OOP_OOP_ITERATE_DEFN_m)
242 270
243 #ifndef SERIALGC 271 #ifndef SERIALGC
244 template <class T> 272 template <class T>
245 void specialized_oop_copy_contents(instanceRefKlass *ref, 273 void specialized_oop_copy_contents(instanceRefKlass *ref,
246 PSPromotionManager* pm, oop obj) { 274 PSPromotionManager* pm, oop obj) {
421 } 449 }
422 } 450 }
423 // Verify next field 451 // Verify next field
424 oop next = java_lang_ref_Reference::next(obj); 452 oop next = java_lang_ref_Reference::next(obj);
425 if (next != NULL) { 453 if (next != NULL) {
426 guarantee(next->is_oop(), "next field verify fa iled"); 454 guarantee(next->is_oop(), "next field verify failed");
427 guarantee(next->is_instanceRef(), "next field verify failed"); 455 guarantee(next->is_instanceRef(), "next field verify failed");
428 if (gch != NULL && !gch->is_in_youngest(obj)) { 456 if (gch != NULL && !gch->is_in_youngest(obj)) {
429 // We do a specific remembered set check here since the next field is 457 // We do a specific remembered set check here since the next field is
430 // not part of the oop mask and therefore skipped by the regular 458 // not part of the oop mask and therefore skipped by the regular
431 // verify code. 459 // verify code.

mercurial