comparison 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
comparison
equal deleted inserted replaced
440:96c6da8f095c 441:da9cb4e97a5f
28 PtrQueue::PtrQueue(PtrQueueSet* qset_, bool perm) : 28 PtrQueue::PtrQueue(PtrQueueSet* qset_, bool perm) :
29 _qset(qset_), _buf(NULL), _index(0), _active(false), 29 _qset(qset_), _buf(NULL), _index(0), _active(false),
30 _perm(perm), _lock(NULL) 30 _perm(perm), _lock(NULL)
31 {} 31 {}
32 32
33 PtrQueue::~PtrQueue() { 33 void PtrQueue::flush() {
34 if (!_perm && _buf != NULL) { 34 if (!_perm && _buf != NULL) {
35 if (_index == _sz) { 35 if (_index == _sz) {
36 // No work to do. 36 // No work to do.
37 qset()->deallocate_buffer(_buf); 37 qset()->deallocate_buffer(_buf);
38 } else { 38 } else {
39 // We must NULL out the unused entries, then enqueue. 39 // We must NULL out the unused entries, then enqueue.
40 for (size_t i = 0; i < _index; i += oopSize) { 40 for (size_t i = 0; i < _index; i += oopSize) {
41 _buf[byte_index_to_index((int)i)] = NULL; 41 _buf[byte_index_to_index((int)i)] = NULL;
42 } 42 }
43 qset()->enqueue_complete_buffer(_buf); 43 qset()->enqueue_complete_buffer(_buf);
44 _buf = NULL;
45 } 44 }
45 _buf = NULL;
46 _index = 0;
46 } 47 }
47 } 48 }
48 49
49 50
50 static int byte_index_to_index(int ind) { 51 static int byte_index_to_index(int ind) {