< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.cpp

Print this page
rev 50928 : Process remaining SATB buffers in final mark/traverse loop instead of separate phase

@@ -203,11 +203,10 @@
     }
 
     _cm->concurrent_scan_code_roots(worker_id, rp, _update_refs);
     _cm->mark_loop(worker_id, _terminator, rp,
                    true, // cancellable
-                   true, // drain SATBs as we go
                    _cm->unload_classes(),
                    _update_refs,
                    ShenandoahStringDedup::is_enabled()); // perform string dedup
   }
 };

@@ -231,11 +230,11 @@
     // First drain remaining SATB buffers.
     // Notice that this is not strictly necessary for mark-compact. But since
     // it requires a StrongRootsScope around the task, we need to claim the
     // threads, and performance-wise it doesn't really matter. Adds about 1ms to
     // full-gc.
-    _cm->drain_satb_buffers(worker_id, true);
+    _cm->drain_satb_buffers(worker_id);
 
     ReferenceProcessor* rp;
     if (_cm->process_references()) {
       rp = ShenandoahHeap::heap()->ref_processor();
       shenandoah_assert_rp_isalive_installed();

@@ -246,11 +245,10 @@
     // Degenerated cycle may bypass concurrent cycle, so code roots might not be scanned,
     // let's check here.
     _cm->concurrent_scan_code_roots(worker_id, rp, _update_refs);
     _cm->mark_loop(worker_id, _terminator, rp,
                    false, // not cancellable
-                   false, // do not drain SATBs, already drained
                    _unload_classes,
                    _update_refs,
                    _dedup_string);
 
     assert(_cm->task_queues()->is_empty(), "Should be empty");

@@ -497,21 +495,15 @@
       }
     }
   }
 };
 
-void ShenandoahConcurrentMark::drain_satb_buffers(uint worker_id, bool remark) {
+void ShenandoahConcurrentMark::drain_satb_buffers(uint worker_id) {
   ShenandoahObjToScanQueue* q = get_queue(worker_id);
   ShenandoahSATBBufferClosure cl(q);
-
-  SATBMarkQueueSet& satb_mq_set = ShenandoahBarrierSet::satb_mark_queue_set();
-  while (satb_mq_set.apply_closure_to_completed_buffer(&cl));
-
-  if (remark) {
     ShenandoahSATBThreadsClosure tc(&cl);
     Threads::threads_do(&tc);
-  }
 }
 
 #if TASKQUEUE_STATS
 void ShenandoahConcurrentMark::print_taskqueue_stats_hdr(outputStream* const st) {
   st->print_raw_cr("GC Task Stats");

@@ -573,11 +565,10 @@
 
     shenandoah_assert_rp_isalive_installed();
 
     scm->mark_loop(_worker_id, _terminator, rp,
                    false, // not cancellable
-                   false, // do not drain SATBs
                    scm->unload_classes(),
                    sh->has_forwarded_objects(),
                    false);  // do not do strdedup
 
     if (_reset_terminator) {

@@ -799,11 +790,10 @@
     ReferenceProcessor* rp = sh->ref_processor();
     shenandoah_assert_rp_isalive_installed();
 
     scm->mark_loop(0, &terminator, rp,
                    false, // not cancellable
-                   true,  // drain SATBs
                    scm->unload_classes(),
                    sh->has_forwarded_objects(),
                    false); // do not do strdedup
   }
 };

@@ -892,11 +882,11 @@
   q->set_empty();
   q->overflow_stack()->clear();
   q->clear_buffer();
 }
 
-template <bool CANCELLABLE, bool DRAIN_SATB>
+template <bool CANCELLABLE>
 void ShenandoahConcurrentMark::mark_loop_prework(uint w, ParallelTaskTerminator *t, ReferenceProcessor *rp,
                                                  bool class_unload, bool update_refs, bool strdedup) {
   ShenandoahObjToScanQueue* q = get_queue(w);
 
   jushort* ld = get_liveness(w);

@@ -907,43 +897,43 @@
   if (class_unload) {
     if (update_refs) {
       if (strdedup) {
         ShenandoahStrDedupQueue* dq = ShenandoahStringDedup::queue(w);
         ShenandoahMarkUpdateRefsMetadataDedupClosure cl(q, dq, rp);
-        mark_loop_work<ShenandoahMarkUpdateRefsMetadataDedupClosure, CANCELLABLE, DRAIN_SATB>(&cl, ld, w, t);
+        mark_loop_work<ShenandoahMarkUpdateRefsMetadataDedupClosure, CANCELLABLE>(&cl, ld, w, t);
       } else {
         ShenandoahMarkUpdateRefsMetadataClosure cl(q, rp);
-        mark_loop_work<ShenandoahMarkUpdateRefsMetadataClosure, CANCELLABLE, DRAIN_SATB>(&cl, ld, w, t);
+        mark_loop_work<ShenandoahMarkUpdateRefsMetadataClosure, CANCELLABLE>(&cl, ld, w, t);
       }
     } else {
       if (strdedup) {
         ShenandoahStrDedupQueue* dq = ShenandoahStringDedup::queue(w);
         ShenandoahMarkRefsMetadataDedupClosure cl(q, dq, rp);
-        mark_loop_work<ShenandoahMarkRefsMetadataDedupClosure, CANCELLABLE, DRAIN_SATB>(&cl, ld, w, t);
+        mark_loop_work<ShenandoahMarkRefsMetadataDedupClosure, CANCELLABLE>(&cl, ld, w, t);
       } else {
         ShenandoahMarkRefsMetadataClosure cl(q, rp);
-        mark_loop_work<ShenandoahMarkRefsMetadataClosure, CANCELLABLE, DRAIN_SATB>(&cl, ld, w, t);
+        mark_loop_work<ShenandoahMarkRefsMetadataClosure, CANCELLABLE>(&cl, ld, w, t);
       }
     }
   } else {
     if (update_refs) {
       if (strdedup) {
         ShenandoahStrDedupQueue* dq = ShenandoahStringDedup::queue(w);
         ShenandoahMarkUpdateRefsDedupClosure cl(q, dq, rp);
-        mark_loop_work<ShenandoahMarkUpdateRefsDedupClosure, CANCELLABLE, DRAIN_SATB>(&cl, ld, w, t);
+        mark_loop_work<ShenandoahMarkUpdateRefsDedupClosure, CANCELLABLE>(&cl, ld, w, t);
       } else {
         ShenandoahMarkUpdateRefsClosure cl(q, rp);
-        mark_loop_work<ShenandoahMarkUpdateRefsClosure, CANCELLABLE, DRAIN_SATB>(&cl, ld, w, t);
+        mark_loop_work<ShenandoahMarkUpdateRefsClosure, CANCELLABLE>(&cl, ld, w, t);
       }
     } else {
       if (strdedup) {
         ShenandoahStrDedupQueue* dq = ShenandoahStringDedup::queue(w);
         ShenandoahMarkRefsDedupClosure cl(q, dq, rp);
-        mark_loop_work<ShenandoahMarkRefsDedupClosure, CANCELLABLE, DRAIN_SATB>(&cl, ld, w, t);
+        mark_loop_work<ShenandoahMarkRefsDedupClosure, CANCELLABLE>(&cl, ld, w, t);
       } else {
         ShenandoahMarkRefsClosure cl(q, rp);
-        mark_loop_work<ShenandoahMarkRefsClosure, CANCELLABLE, DRAIN_SATB>(&cl, ld, w, t);
+        mark_loop_work<ShenandoahMarkRefsClosure, CANCELLABLE>(&cl, ld, w, t);
       }
     }
   }
 
 

@@ -954,11 +944,11 @@
       r->increase_live_data_gc_words(live);
     }
   }
 }
 
-template <class T, bool CANCELLABLE, bool DRAIN_SATB>
+template <class T, bool CANCELLABLE>
 void ShenandoahConcurrentMark::mark_loop_work(T* cl, jushort* live_data, uint worker_id, ParallelTaskTerminator *terminator) {
   int seed = 17;
   uintx stride = CANCELLABLE ? ShenandoahMarkLoopStride : 1;
 
   ShenandoahHeap* heap = ShenandoahHeap::heap();

@@ -1007,15 +997,13 @@
       ShenandoahCancelledTerminatorTerminator tt;
       while (!terminator->offer_termination(&tt));
       return;
     }
 
-    if (DRAIN_SATB) {
       while (satb_mq_set.completed_buffers_num() > 0) {
         satb_mq_set.apply_closure_to_completed_buffer(&drain_satb);
       }
-    }
 
     uint work = 0;
     for (uint i = 0; i < stride; i++) {
       if (try_queue(q, t) ||
           queues->steal(worker_id, &seed, t)) {
< prev index next >