< prev index next >

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

Print this page
*** 128,12 ***
      g1h->upgrade_to_full_collection();
    }
  }
  
  void VM_G1PauseConcurrent::doit() {
-   GCIdMark gc_id_mark(_gc_id);
    G1CollectedHeap* g1h = G1CollectedHeap::heap();
    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);
--- 128,17 ---
      g1h->upgrade_to_full_collection();
    }
  }
  
  void VM_G1PauseConcurrent::doit() {
    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 ***
  }
  
  bool VM_G1PauseConcurrent::doit_prologue() {
    Heap_lock->lock();
    G1CollectedHeap* g1h = G1CollectedHeap::heap();
!   if (g1h->is_shutting_down()) {
      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;
  }
  
--- 153,13 ---
  }
  
  bool VM_G1PauseConcurrent::doit_prologue() {
    Heap_lock->lock();
    G1CollectedHeap* g1h = G1CollectedHeap::heap();
!   _is_shutting_down = g1h->is_shutting_down();
+   if (_is_shutting_down && !g1h->concurrent_mark()->shutdown_cleanup_needed()) {
      Heap_lock->unlock();
      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 >