446 |
446 |
447 void DiscoveredListIterator::load_ptrs(DEBUG_ONLY(bool allow_null_referent)) { |
447 void DiscoveredListIterator::load_ptrs(DEBUG_ONLY(bool allow_null_referent)) { |
448 _discovered_addr = java_lang_ref_Reference::discovered_addr(_ref); |
448 _discovered_addr = java_lang_ref_Reference::discovered_addr(_ref); |
449 oop discovered = java_lang_ref_Reference::discovered(_ref); |
449 oop discovered = java_lang_ref_Reference::discovered(_ref); |
450 assert(_discovered_addr && discovered->is_oop_or_null(), |
450 assert(_discovered_addr && discovered->is_oop_or_null(), |
451 err_msg("Expected an oop or NULL for discovered field at " PTR_FORMAT, p2i(discovered))); |
451 "Expected an oop or NULL for discovered field at " PTR_FORMAT, p2i(discovered)); |
452 _next = discovered; |
452 _next = discovered; |
453 _referent_addr = java_lang_ref_Reference::referent_addr(_ref); |
453 _referent_addr = java_lang_ref_Reference::referent_addr(_ref); |
454 _referent = java_lang_ref_Reference::referent(_ref); |
454 _referent = java_lang_ref_Reference::referent(_ref); |
455 assert(Universe::heap()->is_in_reserved_or_null(_referent), |
455 assert(Universe::heap()->is_in_reserved_or_null(_referent), |
456 "Wrong oop found in java.lang.Reference object"); |
456 "Wrong oop found in java.lang.Reference object"); |
457 assert(allow_null_referent ? |
457 assert(allow_null_referent ? |
458 _referent->is_oop_or_null() |
458 _referent->is_oop_or_null() |
459 : _referent->is_oop(), |
459 : _referent->is_oop(), |
460 err_msg("Expected an oop%s for referent field at " PTR_FORMAT, |
460 "Expected an oop%s for referent field at " PTR_FORMAT, |
461 (allow_null_referent ? " or NULL" : ""), |
461 (allow_null_referent ? " or NULL" : ""), |
462 p2i(_referent))); |
462 p2i(_referent)); |
463 } |
463 } |
464 |
464 |
465 void DiscoveredListIterator::remove() { |
465 void DiscoveredListIterator::remove() { |
466 assert(_ref->is_oop(), "Dropping a bad reference"); |
466 assert(_ref->is_oop(), "Dropping a bad reference"); |
467 oop_store_raw(_discovered_addr, NULL); |
467 oop_store_raw(_discovered_addr, NULL); |
587 iter.load_ptrs(DEBUG_ONLY(true /* allow_null_referent */)); |
587 iter.load_ptrs(DEBUG_ONLY(true /* allow_null_referent */)); |
588 HeapWord* next_addr = java_lang_ref_Reference::next_addr(iter.obj()); |
588 HeapWord* next_addr = java_lang_ref_Reference::next_addr(iter.obj()); |
589 oop next = java_lang_ref_Reference::next(iter.obj()); |
589 oop next = java_lang_ref_Reference::next(iter.obj()); |
590 if ((iter.referent() == NULL || iter.is_referent_alive() || |
590 if ((iter.referent() == NULL || iter.is_referent_alive() || |
591 next != NULL)) { |
591 next != NULL)) { |
592 assert(next->is_oop_or_null(), err_msg("Expected an oop or NULL for next field at " PTR_FORMAT, p2i(next))); |
592 assert(next->is_oop_or_null(), "Expected an oop or NULL for next field at " PTR_FORMAT, p2i(next)); |
593 // Remove Reference object from list |
593 // Remove Reference object from list |
594 iter.remove(); |
594 iter.remove(); |
595 // Trace the cohorts |
595 // Trace the cohorts |
596 iter.make_referent_alive(); |
596 iter.make_referent_alive(); |
597 if (UseCompressedOops) { |
597 if (UseCompressedOops) { |
993 // cleared concurrently by mutators during (or after) discovery. |
993 // cleared concurrently by mutators during (or after) discovery. |
994 void ReferenceProcessor::verify_referent(oop obj) { |
994 void ReferenceProcessor::verify_referent(oop obj) { |
995 bool da = discovery_is_atomic(); |
995 bool da = discovery_is_atomic(); |
996 oop referent = java_lang_ref_Reference::referent(obj); |
996 oop referent = java_lang_ref_Reference::referent(obj); |
997 assert(da ? referent->is_oop() : referent->is_oop_or_null(), |
997 assert(da ? referent->is_oop() : referent->is_oop_or_null(), |
998 err_msg("Bad referent " INTPTR_FORMAT " found in Reference " |
998 "Bad referent " INTPTR_FORMAT " found in Reference " |
999 INTPTR_FORMAT " during %satomic discovery ", |
999 INTPTR_FORMAT " during %satomic discovery ", |
1000 p2i(referent), p2i(obj), da ? "" : "non-")); |
1000 p2i(referent), p2i(obj), da ? "" : "non-"); |
1001 } |
1001 } |
1002 #endif |
1002 #endif |
1003 |
1003 |
1004 // We mention two of several possible choices here: |
1004 // We mention two of several possible choices here: |
1005 // #0: if the reference object is not in the "originating generation" |
1005 // #0: if the reference object is not in the "originating generation" |
1070 |
1070 |
1071 ResourceMark rm; // Needed for tracing. |
1071 ResourceMark rm; // Needed for tracing. |
1072 |
1072 |
1073 HeapWord* const discovered_addr = java_lang_ref_Reference::discovered_addr(obj); |
1073 HeapWord* const discovered_addr = java_lang_ref_Reference::discovered_addr(obj); |
1074 const oop discovered = java_lang_ref_Reference::discovered(obj); |
1074 const oop discovered = java_lang_ref_Reference::discovered(obj); |
1075 assert(discovered->is_oop_or_null(), err_msg("Expected an oop or NULL for discovered field at " PTR_FORMAT, p2i(discovered))); |
1075 assert(discovered->is_oop_or_null(), "Expected an oop or NULL for discovered field at " PTR_FORMAT, p2i(discovered)); |
1076 if (discovered != NULL) { |
1076 if (discovered != NULL) { |
1077 // The reference has already been discovered... |
1077 // The reference has already been discovered... |
1078 if (TraceReferenceGC) { |
1078 if (TraceReferenceGC) { |
1079 gclog_or_tty->print_cr("Already discovered reference (" INTPTR_FORMAT ": %s)", |
1079 gclog_or_tty->print_cr("Already discovered reference (" INTPTR_FORMAT ": %s)", |
1080 p2i(obj), obj->klass()->internal_name()); |
1080 p2i(obj), obj->klass()->internal_name()); |