< prev index next >

src/hotspot/share/gc/g1/g1VMOperations.cpp

Print this page
@@ -128,12 +128,17 @@
      g1h->upgrade_to_full_collection();
    }
  }
  
  void VM_G1PauseConcurrent::doit() {
-   GCIdMark gc_id_mark(_gc_id);
    G1CollectedHeap* g1h = G1CollectedHeap::heap();
+   if (_is_shutting_down) {
+     g1h->concurrent_mark()->shutdown_concurrent_cycle();
+     return;
+   }
+ 
+   GCIdMark gc_id_mark(_gc_id);
    GCTraceCPUTime tcpu(g1h->concurrent_mark()->gc_tracer_cm());
  
    // GCTraceTime(...) only supports sub-phases, so a more verbose version
    // is needed when we report the top-level pause phase.
    GCTraceTimeLogger(Info, gc) logger(_message, GCCause::_no_gc, true);

@@ -148,16 +153,13 @@
  }
  
  bool VM_G1PauseConcurrent::doit_prologue() {
    Heap_lock->lock();
    G1CollectedHeap* g1h = G1CollectedHeap::heap();
-   if (g1h->is_shutting_down()) {
+   _is_shutting_down = g1h->is_shutting_down();
+   if (_is_shutting_down && !g1h->concurrent_mark()->shutdown_cleanup_needed()) {
      Heap_lock->unlock();
-     // JVM shutdown has started. Abort concurrent marking to ensure that any further
-     // concurrent VM operations will not try to start and interfere with the shutdown
-     // process.
-     g1h->concurrent_mark()->abort_marking_threads();
      return false;
    }
    return true;
  }
  

@@ -175,5 +177,21 @@
  
  void VM_G1PauseCleanup::work() {
    G1ConcurrentMark* cm = G1CollectedHeap::heap()->concurrent_mark();
    cm->cleanup();
  }
+ 
+ bool VM_G1StopMarking::doit_prologue() {
+   G1CollectedHeap* g1h = G1CollectedHeap::heap();
+ #ifdef ASSERT
+   {
+     MutexLocker ml(Heap_lock);
+     assert(g1h->is_shutting_down(), "must be");
+   }
+ #endif
+   return g1h->concurrent_mark()->shutdown_cleanup_needed();
+ }
+ 
+ void VM_G1StopMarking::doit() {
+   G1ConcurrentMark* cm = G1CollectedHeap::heap()->concurrent_mark();
+   cm->shutdown_concurrent_cycle();
+ }
< prev index next >