< prev index next >

src/share/vm/gc/g1/dirtyCardQueue.cpp

Print this page
rev 9217 : imported patch rename_debug_only
rev 9218 : imported patch fix_constructor_set_types
rev 9221 : [mq]: simplify_loops

*** 30,39 **** --- 30,51 ---- #include "runtime/atomic.inline.hpp" #include "runtime/mutexLocker.hpp" #include "runtime/safepoint.hpp" #include "runtime/thread.inline.hpp" + DirtyCardQueue::DirtyCardQueue(DirtyCardQueueSet* qset, bool permanent) : + // Dirty card queues are always active, so we create them with their + // active field set to true. + PtrQueue(qset, permanent, true /* active */) + { } + + DirtyCardQueue::~DirtyCardQueue() { + if (!is_permanent()) { + flush(); + } + } + bool DirtyCardQueue::apply_closure(CardTableEntryClosure* cl, bool consume, uint worker_i) { bool res = true; if (_buf != NULL) {
*** 49,65 **** void** buf, size_t index, size_t sz, bool consume, uint worker_i) { if (cl == NULL) return true; ! for (size_t i = index; i < sz; i += oopSize) { ! int ind = byte_index_to_index((int)i); ! jbyte* card_ptr = (jbyte*)buf[ind]; if (card_ptr != NULL) { // Set the entry to null, so we don't do it again (via the test // above) if we reconsider this buffer. ! if (consume) buf[ind] = NULL; if (!cl->do_card_ptr(card_ptr, worker_i)) return false; } } return true; } --- 61,77 ---- void** buf, size_t index, size_t sz, bool consume, uint worker_i) { if (cl == NULL) return true; ! size_t limit = byte_index_to_index(sz); ! for (size_t i = byte_index_to_index(index); i < limit; ++i) { ! jbyte* card_ptr = static_cast<jbyte*>(buf[i]); if (card_ptr != NULL) { // Set the entry to null, so we don't do it again (via the test // above) if we reconsider this buffer. ! if (consume) buf[i] = NULL; if (!cl->do_card_ptr(card_ptr, worker_i)) return false; } } return true; }
*** 81,97 **** // Determines how many mutator threads can process the buffers in parallel. uint DirtyCardQueueSet::num_par_ids() { return (uint)os::processor_count(); } ! void DirtyCardQueueSet::initialize(CardTableEntryClosure* cl, Monitor* cbl_mon, Mutex* fl_lock, int process_completed_threshold, int max_completed_queue, ! Mutex* lock, PtrQueueSet* fl_owner) { _mut_process_closure = cl; ! PtrQueueSet::initialize(cbl_mon, fl_lock, process_completed_threshold, ! max_completed_queue, fl_owner); set_buffer_size(G1UpdateBufferSize); _shared_dirty_card_queue.set_lock(lock); _free_ids = new FreeIdSet((int) num_par_ids(), _cbl_mon); } --- 93,115 ---- // Determines how many mutator threads can process the buffers in parallel. uint DirtyCardQueueSet::num_par_ids() { return (uint)os::processor_count(); } ! void DirtyCardQueueSet::initialize(CardTableEntryClosure* cl, ! Monitor* cbl_mon, ! Mutex* fl_lock, int process_completed_threshold, int max_completed_queue, ! Mutex* lock, ! DirtyCardQueueSet* fl_owner) { _mut_process_closure = cl; ! PtrQueueSet::initialize(cbl_mon, ! fl_lock, ! process_completed_threshold, ! max_completed_queue, ! fl_owner); set_buffer_size(G1UpdateBufferSize); _shared_dirty_card_queue.set_lock(lock); _free_ids = new FreeIdSet((int) num_par_ids(), _cbl_mon); }
*** 101,111 **** void DirtyCardQueueSet::iterate_closure_all_threads(CardTableEntryClosure* cl, bool consume, uint worker_i) { assert(SafepointSynchronize::is_at_safepoint(), "Must be at safepoint."); ! for(JavaThread* t = Threads::first(); t; t = t->next()) { bool b = t->dirty_card_queue().apply_closure(cl, consume); guarantee(b, "Should not be interrupted."); } bool b = shared_dirty_card_queue()->apply_closure(cl, consume, --- 119,129 ---- void DirtyCardQueueSet::iterate_closure_all_threads(CardTableEntryClosure* cl, bool consume, uint worker_i) { assert(SafepointSynchronize::is_at_safepoint(), "Must be at safepoint."); ! for (JavaThread* t = Threads::first(); t; t = t->next()) { bool b = t->dirty_card_queue().apply_closure(cl, consume); guarantee(b, "Should not be interrupted."); } bool b = shared_dirty_card_queue()->apply_closure(cl, consume,
*** 176,186 **** if (_completed_buffers_head == NULL) _completed_buffers_tail = NULL; _n_completed_buffers--; assert(_n_completed_buffers >= 0, "Invariant"); } ! debug_only(assert_completed_buffer_list_len_correct_locked()); return nd; } bool DirtyCardQueueSet:: apply_closure_to_completed_buffer_helper(CardTableEntryClosure* cl, --- 194,204 ---- if (_completed_buffers_head == NULL) _completed_buffers_tail = NULL; _n_completed_buffers--; assert(_n_completed_buffers >= 0, "Invariant"); } ! DEBUG_ONLY(assert_completed_buffer_list_len_correct_locked()); return nd; } bool DirtyCardQueueSet:: apply_closure_to_completed_buffer_helper(CardTableEntryClosure* cl,
*** 257,267 **** nd->set_next(buffers_to_delete); buffers_to_delete = nd; } _n_completed_buffers = 0; _completed_buffers_tail = NULL; ! debug_only(assert_completed_buffer_list_len_correct_locked()); } while (buffers_to_delete != NULL) { BufferNode* nd = buffers_to_delete; buffers_to_delete = nd->next(); deallocate_buffer(BufferNode::make_buffer_from_node(nd)); --- 275,285 ---- nd->set_next(buffers_to_delete); buffers_to_delete = nd; } _n_completed_buffers = 0; _completed_buffers_tail = NULL; ! DEBUG_ONLY(assert_completed_buffer_list_len_correct_locked()); } while (buffers_to_delete != NULL) { BufferNode* nd = buffers_to_delete; buffers_to_delete = nd->next(); deallocate_buffer(BufferNode::make_buffer_from_node(nd));
*** 289,302 **** _max_completed_queue = max_jint; assert(SafepointSynchronize::is_at_safepoint(), "Must be at safepoint."); for (JavaThread* t = Threads::first(); t; t = t->next()) { DirtyCardQueue& dcq = t->dirty_card_queue(); if (dcq.size() != 0) { ! void **buf = t->dirty_card_queue().get_buf(); // We must NULL out the unused entries, then enqueue. ! for (size_t i = 0; i < t->dirty_card_queue().get_index(); i += oopSize) { ! buf[PtrQueue::byte_index_to_index((int)i)] = NULL; } enqueue_complete_buffer(dcq.get_buf(), dcq.get_index()); dcq.reinitialize(); } } --- 307,321 ---- _max_completed_queue = max_jint; assert(SafepointSynchronize::is_at_safepoint(), "Must be at safepoint."); for (JavaThread* t = Threads::first(); t; t = t->next()) { DirtyCardQueue& dcq = t->dirty_card_queue(); if (dcq.size() != 0) { ! void** buf = dcq.get_buf(); // We must NULL out the unused entries, then enqueue. ! size_t limit = dcq.byte_index_to_index(dcq.get_index()); ! for (size_t i = 0; i < limit; ++i) { ! buf[i] = NULL; } enqueue_complete_buffer(dcq.get_buf(), dcq.get_index()); dcq.reinitialize(); } }
< prev index next >