3232#include " runtime/safepoint.hpp"
3333#include " runtime/thread.inline.hpp"
3434
35+ DirtyCardQueue::DirtyCardQueue (DirtyCardQueueSet* qset, bool permanent) :
36+ // Dirty card queues are always active, so we create them with their
37+ // active field set to true.
38+ PtrQueue(qset, permanent, true /* active */ )
39+ { }
40+
41+ DirtyCardQueue::~DirtyCardQueue () {
42+ if (!is_permanent ()) {
43+ flush ();
44+ }
45+ }
46+
3547bool DirtyCardQueue::apply_closure (CardTableEntryClosure* cl,
3648 bool consume,
3749 uint worker_i) {
@@ -40,7 +52,9 @@ bool DirtyCardQueue::apply_closure(CardTableEntryClosure* cl,
4052 res = apply_closure_to_buffer (cl, _buf, _index, _sz,
4153 consume,
4254 worker_i);
43- if (res && consume) _index = _sz;
55+ if (res && consume) {
56+ _index = _sz;
57+ }
4458 }
4559 return res;
4660}
@@ -51,14 +65,18 @@ bool DirtyCardQueue::apply_closure_to_buffer(CardTableEntryClosure* cl,
5165 bool consume,
5266 uint worker_i) {
5367 if (cl == NULL ) return true ;
54- for ( size_t i = index; i < sz; i += oopSize) {
55- int ind = byte_index_to_index (( int )i);
56- jbyte* card_ptr = ( jbyte*) buf[ind] ;
68+ size_t limit = byte_index_to_index (sz);
69+ for ( size_t i = byte_index_to_index (index); i < limit; ++i) {
70+ jbyte* card_ptr = static_cast < jbyte*>( buf[i]) ;
5771 if (card_ptr != NULL ) {
5872 // Set the entry to null, so we don't do it again (via the test
5973 // above) if we reconsider this buffer.
60- if (consume) buf[ind] = NULL ;
61- if (!cl->do_card_ptr (card_ptr, worker_i)) return false ;
74+ if (consume) {
75+ buf[i] = NULL ;
76+ }
77+ if (!cl->do_card_ptr (card_ptr, worker_i)) {
78+ return false ;
79+ }
6280 }
6381 }
6482 return true ;
@@ -71,7 +89,7 @@ bool DirtyCardQueue::apply_closure_to_buffer(CardTableEntryClosure* cl,
7189DirtyCardQueueSet::DirtyCardQueueSet (bool notify_when_complete) :
7290 PtrQueueSet(notify_when_complete),
7391 _mut_process_closure(NULL ),
74- _shared_dirty_card_queue(this , true /* perm */ ),
92+ _shared_dirty_card_queue(this , true /* permanent */ ),
7593 _free_ids(NULL ),
7694 _processed_buffers_mut(0 ), _processed_buffers_rs_thread(0 )
7795{
@@ -83,13 +101,19 @@ uint DirtyCardQueueSet::num_par_ids() {
83101 return (uint)os::processor_count ();
84102}
85103
86- void DirtyCardQueueSet::initialize (CardTableEntryClosure* cl, Monitor* cbl_mon, Mutex* fl_lock,
104+ void DirtyCardQueueSet::initialize (CardTableEntryClosure* cl,
105+ Monitor* cbl_mon,
106+ Mutex* fl_lock,
87107 int process_completed_threshold,
88108 int max_completed_queue,
89- Mutex* lock, PtrQueueSet* fl_owner) {
109+ Mutex* lock,
110+ DirtyCardQueueSet* fl_owner) {
90111 _mut_process_closure = cl;
91- PtrQueueSet::initialize (cbl_mon, fl_lock, process_completed_threshold,
92- max_completed_queue, fl_owner);
112+ PtrQueueSet::initialize (cbl_mon,
113+ fl_lock,
114+ process_completed_threshold,
115+ max_completed_queue,
116+ fl_owner);
93117 set_buffer_size (G1UpdateBufferSize);
94118 _shared_dirty_card_queue.set_lock (lock);
95119 _free_ids = new FreeIdSet ((int ) num_par_ids (), _cbl_mon);
@@ -103,7 +127,7 @@ void DirtyCardQueueSet::iterate_closure_all_threads(CardTableEntryClosure* cl,
103127 bool consume,
104128 uint worker_i) {
105129 assert (SafepointSynchronize::is_at_safepoint (), " Must be at safepoint." );
106- for (JavaThread* t = Threads::first (); t; t = t->next ()) {
130+ for (JavaThread* t = Threads::first (); t; t = t->next ()) {
107131 bool b = t->dirty_card_queue ().apply_closure (cl, consume);
108132 guarantee (b, " Should not be interrupted." );
109133 }
@@ -160,8 +184,7 @@ bool DirtyCardQueueSet::mut_process_buffer(void** buf) {
160184}
161185
162186
163- BufferNode*
164- DirtyCardQueueSet::get_completed_buffer (int stop_at) {
187+ BufferNode* DirtyCardQueueSet::get_completed_buffer (int stop_at) {
165188 BufferNode* nd = NULL ;
166189 MutexLockerEx x (_cbl_mon, Mutex::_no_safepoint_check_flag);
167190
@@ -178,14 +201,13 @@ DirtyCardQueueSet::get_completed_buffer(int stop_at) {
178201 _n_completed_buffers--;
179202 assert (_n_completed_buffers >= 0 , " Invariant" );
180203 }
181- debug_only (assert_completed_buffer_list_len_correct_locked ());
204+ DEBUG_ONLY (assert_completed_buffer_list_len_correct_locked ());
182205 return nd;
183206}
184207
185- bool DirtyCardQueueSet::
186- apply_closure_to_completed_buffer_helper (CardTableEntryClosure* cl,
187- uint worker_i,
188- BufferNode* nd) {
208+ bool DirtyCardQueueSet::apply_closure_to_completed_buffer_helper (CardTableEntryClosure* cl,
209+ uint worker_i,
210+ BufferNode* nd) {
189211 if (nd != NULL ) {
190212 void **buf = BufferNode::make_buffer_from_node (nd);
191213 size_t index = nd->index ();
@@ -259,7 +281,7 @@ void DirtyCardQueueSet::clear() {
259281 }
260282 _n_completed_buffers = 0 ;
261283 _completed_buffers_tail = NULL ;
262- debug_only (assert_completed_buffer_list_len_correct_locked ());
284+ DEBUG_ONLY (assert_completed_buffer_list_len_correct_locked ());
263285 }
264286 while (buffers_to_delete != NULL ) {
265287 BufferNode* nd = buffers_to_delete;
@@ -291,10 +313,11 @@ void DirtyCardQueueSet::concatenate_logs() {
291313 for (JavaThread* t = Threads::first (); t; t = t->next ()) {
292314 DirtyCardQueue& dcq = t->dirty_card_queue ();
293315 if (dcq.size () != 0 ) {
294- void ** buf = t-> dirty_card_queue () .get_buf ();
316+ void ** buf = dcq .get_buf ();
295317 // We must NULL out the unused entries, then enqueue.
296- for (size_t i = 0 ; i < t->dirty_card_queue ().get_index (); i += oopSize) {
297- buf[PtrQueue::byte_index_to_index ((int )i)] = NULL ;
318+ size_t limit = dcq.byte_index_to_index (dcq.get_index ());
319+ for (size_t i = 0 ; i < limit; ++i) {
320+ buf[i] = NULL ;
298321 }
299322 enqueue_complete_buffer (dcq.get_buf (), dcq.get_index ());
300323 dcq.reinitialize ();
0 commit comments