diff src/share/vm/gc_implementation/g1/ptrQueue.cpp @ 441:da9cb4e97a5f

6770608: G1: Mutator thread can flush barrier and satb queues during safepoint 6660573: G1: BigApps Failure : guarantee(satb_mq_set.completed_buffers_num() == 0,"invariant") Summary: When exiting a mutator thread is removed from the thread list before it has a chance to flush its SATB and barrier queues. If GC happens at this moment the objects that are refererred from these queues can be moved, which will case a crash. The fix is simply to flush the buffers before removing a thread from the list. Reviewed-by: jcoomes, tonyp
author iveresov
date Fri, 14 Nov 2008 14:23:05 -0800
parents 37f87013dfd8
children ad8c8ca4ab0f
line wrap: on
line diff
--- a/src/share/vm/gc_implementation/g1/ptrQueue.cpp	Fri Nov 07 12:52:16 2008 -0800
+++ b/src/share/vm/gc_implementation/g1/ptrQueue.cpp	Fri Nov 14 14:23:05 2008 -0800
@@ -30,7 +30,7 @@
   _perm(perm), _lock(NULL)
 {}
 
-PtrQueue::~PtrQueue() {
+void PtrQueue::flush() {
   if (!_perm && _buf != NULL) {
     if (_index == _sz) {
       // No work to do.
@@ -41,8 +41,9 @@
         _buf[byte_index_to_index((int)i)] = NULL;
       }
       qset()->enqueue_complete_buffer(_buf);
-      _buf = NULL;
     }
+    _buf = NULL;
+    _index = 0;
   }
 }