hotspot/src/share/vm/gc/shared/referenceProcessor.cpp
changeset 33105 294e48b4f704
parent 33103 116b558af514
child 33107 77bf0d2069a3
equal deleted inserted replaced
33104:a7c0f60a1294 33105:294e48b4f704
   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());