< prev index next >

src/hotspot/share/gc/shared/referenceProcessor.cpp

Print this page
rev 49944 : imported patch 8201492-properly-implement-non-contiguous-reference-processing
rev 49945 : imported patch 8201492-stefanj-review

*** 90,113 **** _soft_ref_timestamp_clock = java_lang_ref_SoftReference::clock(); _discovering_refs = true; } ! ReferenceProcessor::ReferenceProcessor(MemRegion span, bool mt_processing, uint mt_processing_degree, bool mt_discovery, uint mt_discovery_degree, bool atomic_discovery, BoolObjectClosure* is_alive_non_header) : _discovering_refs(false), _enqueuing_is_done(false), _is_alive_non_header(is_alive_non_header), _processing_is_mt(mt_processing), _next_id(0) { ! _span = span; _discovery_is_atomic = atomic_discovery; _discovery_is_mt = mt_discovery; _num_q = MAX2(1U, mt_processing_degree); _max_num_q = MAX2(_num_q, mt_discovery_degree); _discovered_refs = NEW_C_HEAP_ARRAY(DiscoveredList, --- 90,115 ---- _soft_ref_timestamp_clock = java_lang_ref_SoftReference::clock(); _discovering_refs = true; } ! ReferenceProcessor::ReferenceProcessor(BoolObjectClosure* is_subject_to_discovery, bool mt_processing, uint mt_processing_degree, bool mt_discovery, uint mt_discovery_degree, bool atomic_discovery, BoolObjectClosure* is_alive_non_header) : + _is_subject_to_discovery(is_subject_to_discovery), _discovering_refs(false), _enqueuing_is_done(false), _is_alive_non_header(is_alive_non_header), _processing_is_mt(mt_processing), _next_id(0) { ! assert(is_subject_to_discovery != NULL, "must be set"); ! _discovery_is_atomic = atomic_discovery; _discovery_is_mt = mt_discovery; _num_q = MAX2(1U, mt_processing_degree); _max_num_q = MAX2(_num_q, mt_discovery_degree); _discovered_refs = NEW_C_HEAP_ARRAY(DiscoveredList,
*** 447,456 **** --- 449,471 ---- complete_gc->do_void(); log_develop_trace(gc, ref)(" Dropped " SIZE_FORMAT " dead Refs out of " SIZE_FORMAT " discovered Refs by policy, from list " INTPTR_FORMAT, iter.removed(), iter.processed(), p2i(&refs_list)); } + void ReferenceProcessor::process_phase2(DiscoveredList& refs_list, + BoolObjectClosure* is_alive, + OopClosure* keep_alive, + VoidClosure* complete_gc) { + if (discovery_is_atomic()) { + // complete_gc is ignored in this case for this phase + pp2_work(refs_list, is_alive, keep_alive); + } else { + assert(complete_gc != NULL, "Error"); + pp2_work_concurrent_discovery(refs_list, is_alive, + keep_alive, complete_gc); + } + } // Traverse the list and remove any Refs that are not active, or // whose referents are either alive or NULL. void ReferenceProcessor::pp2_work(DiscoveredList& refs_list, BoolObjectClosure* is_alive,
*** 939,948 **** --- 954,967 ---- INTPTR_FORMAT " during %satomic discovery ", p2i(referent), p2i(obj), da ? "" : "non-"); } #endif + bool ReferenceProcessor::is_subject_to_discovery(oop const obj) const { + return _is_subject_to_discovery->do_object_b(obj); + } + // We mention two of several possible choices here: // #0: if the reference object is not in the "originating generation" // (or part of the heap being collected, indicated by our "span" // we don't treat it specially (i.e. we scan it as we would // a normal oop, treating its references as strong references).
*** 976,988 **** oop next = java_lang_ref_Reference::next(obj); if (next != NULL) { // Ref is no longer active return false; } - HeapWord* obj_addr = (HeapWord*)obj; if (RefDiscoveryPolicy == ReferenceBasedDiscovery && ! !_span.contains(obj_addr)) { // Reference is not in the originating generation; // don't treat it specially (i.e. we want to scan it as a normal // object with strong references). return false; } --- 995,1006 ---- oop next = java_lang_ref_Reference::next(obj); if (next != NULL) { // Ref is no longer active return false; } if (RefDiscoveryPolicy == ReferenceBasedDiscovery && ! !is_subject_to_discovery(obj)) { // Reference is not in the originating generation; // don't treat it specially (i.e. we want to scan it as a normal // object with strong references). return false; }
*** 1037,1056 **** if (RefDiscoveryPolicy == ReferentBasedDiscovery) { verify_referent(obj); // Discover if and only if EITHER: // .. reference is in our span, OR // .. we are an atomic collector and referent is in our span ! if (_span.contains(obj_addr) || (discovery_is_atomic() && ! _span.contains(java_lang_ref_Reference::referent(obj)))) { ! // should_enqueue = true; } else { return false; } } else { assert(RefDiscoveryPolicy == ReferenceBasedDiscovery && ! _span.contains(obj_addr), "code inconsistency"); } // Get the right type of discovered queue head. DiscoveredList* list = get_discovered_list(rt); if (list == NULL) { --- 1055,1073 ---- if (RefDiscoveryPolicy == ReferentBasedDiscovery) { verify_referent(obj); // Discover if and only if EITHER: // .. reference is in our span, OR // .. we are an atomic collector and referent is in our span ! if (is_subject_to_discovery(obj) || (discovery_is_atomic() && ! is_subject_to_discovery(java_lang_ref_Reference::referent(obj)))) { } else { return false; } } else { assert(RefDiscoveryPolicy == ReferenceBasedDiscovery && ! is_subject_to_discovery(obj), "code inconsistency"); } // Get the right type of discovered queue head. DiscoveredList* list = get_discovered_list(rt); if (list == NULL) {
< prev index next >