Mercurial > hg > graal-compiler
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) { |