< prev index next >

src/hotspot/share/gc/cms/concurrentMarkSweepGeneration.cpp

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

@@ -288,11 +288,11 @@
 
 void CMSCollector::ref_processor_init() {
   if (_ref_processor == NULL) {
     // Allocate and initialize a reference processor
     _ref_processor =
-      new SpanReferenceProcessor(_span,                               // span
+      new ReferenceProcessor(&_span_discoverer,                      // span
                                  (ParallelGCThreads > 1) && ParallelRefProcEnabled, // mt processing
                                  ParallelGCThreads,                   // mt processing degree
                                  _cmsGen->refs_discovery_is_mt(),     // mt discovery
                                  MAX2(ConcGCThreads, ParallelGCThreads), // mt discovery degree
                                  _cmsGen->refs_discovery_is_atomic(), // discovery is not atomic

@@ -443,22 +443,23 @@
 
 CMSCollector::CMSCollector(ConcurrentMarkSweepGeneration* cmsGen,
                            CardTableRS*                   ct,
                            ConcurrentMarkSweepPolicy*     cp):
   _cmsGen(cmsGen),
+  // Adjust span to cover old (cms) gen
+  _span(cmsGen->reserved()),
   _ct(ct),
+  _span_discoverer(_span),
   _ref_processor(NULL),    // will be set later
   _conc_workers(NULL),     // may be set later
   _abort_preclean(false),
   _start_sampling(false),
   _between_prologue_and_epilogue(false),
   _markBitMap(0, Mutex::leaf + 1, "CMS_markBitMap_lock"),
   _modUnionTable((CardTable::card_shift - LogHeapWordSize),
                  -1 /* lock-free */, "No_lock" /* dummy */),
   _modUnionClosurePar(&_modUnionTable),
-  // Adjust my span to cover old (cms) gen
-  _span(cmsGen->reserved()),
   // Construct the is_alive_closure with _span & markBitMap
   _is_alive_closure(_span, &_markBitMap),
   _restart_addr(NULL),
   _overflow_list(NULL),
   _stats(cmsGen),

@@ -3750,19 +3751,19 @@
   ResourceMark rm;
   HandleMark   hm;
 
   // Precleaning is currently not MT but the reference processor
   // may be set for MT.  Disable it temporarily here.
-  SpanReferenceProcessor* rp = ref_processor();
+  ReferenceProcessor* rp = ref_processor();
   ReferenceProcessorMTDiscoveryMutator rp_mut_discovery(rp, false);
 
   // Do one pass of scrubbing the discovered reference lists
   // to remove any reference objects with strongly-reachable
   // referents.
   if (clean_refs) {
     CMSPrecleanRefsYieldClosure yield_cl(this);
-    assert(rp->span().equals(_span), "Spans should be equal");
+    assert(_span_discoverer.span().equals(_span), "Spans should be equal");
     CMSKeepAliveClosure keep_alive(this, _span, &_markBitMap,
                                    &_markStack, true /* preclean */);
     CMSDrainMarkingStackClosure complete_trace(this,
                                    _span, &_markBitMap, &_markStack,
                                    &keep_alive, true /* preclean */);

@@ -5150,11 +5151,11 @@
 {
   CMSHeap* heap = CMSHeap::heap();
   WorkGang* workers = heap->workers();
   assert(workers != NULL, "Need parallel worker threads.");
   CMSRefProcTaskProxy rp_task(task, &_collector,
-                              _collector.ref_processor()->span(),
+                              _collector.ref_processor_span(),
                               _collector.markBitMap(),
                               workers, _collector.task_queues());
   workers->run_task(&rp_task);
 }
 

@@ -5170,12 +5171,12 @@
 
 void CMSCollector::refProcessingWork() {
   ResourceMark rm;
   HandleMark   hm;
 
-  SpanReferenceProcessor* rp = ref_processor();
-  assert(rp->span().equals(_span), "Spans should be equal");
+  ReferenceProcessor* rp = ref_processor();
+  assert(_span_discoverer.span().equals(_span), "Spans should be equal");
   assert(!rp->enqueuing_is_done(), "Enqueuing should not be complete");
   // Process weak references.
   rp->setup_policy(false);
   verify_work_stacks_empty();
 
< prev index next >