< prev index next >

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

Print this page
rev 10537 : [mq]: yield

*** 153,198 **** bool DirtyCardQueueSet::apply_closure_to_buffer(CardTableEntryClosure* cl, BufferNode* node, bool consume, uint worker_i) { if (cl == NULL) return true; void** buf = BufferNode::make_buffer_from_node(node); size_t limit = DirtyCardQueue::byte_index_to_index(buffer_size()); ! size_t start = DirtyCardQueue::byte_index_to_index(node->index()); ! for (size_t i = start; i < limit; ++i) { jbyte* card_ptr = static_cast<jbyte*>(buf[i]); assert(card_ptr != NULL, "invariant"); if (!cl->do_card_ptr(card_ptr, worker_i)) { ! if (consume) { ! size_t new_index = DirtyCardQueue::index_to_byte_index(i + 1); ! assert(new_index <= buffer_size(), "invariant"); ! node->set_index(new_index); ! } ! return false; } } if (consume) { ! node->set_index(buffer_size()); } ! return true; } bool DirtyCardQueueSet::mut_process_buffer(BufferNode* node) { guarantee(_free_ids != NULL, "must be"); ! // claim a par id ! uint worker_i = _free_ids->claim_par_id(); ! bool b = apply_closure_to_buffer(_mut_process_closure, node, true, worker_i); ! if (b) { Atomic::inc(&_processed_buffers_mut); } ! ! // release the id ! _free_ids->release_par_id(worker_i); ! ! return b; } BufferNode* DirtyCardQueueSet::get_completed_buffer(size_t stop_at) { BufferNode* nd = NULL; --- 153,194 ---- bool DirtyCardQueueSet::apply_closure_to_buffer(CardTableEntryClosure* cl, BufferNode* node, bool consume, uint worker_i) { if (cl == NULL) return true; + bool result = true; void** buf = BufferNode::make_buffer_from_node(node); size_t limit = DirtyCardQueue::byte_index_to_index(buffer_size()); ! size_t i = DirtyCardQueue::byte_index_to_index(node->index()); ! for ( ; i < limit; ++i) { jbyte* card_ptr = static_cast<jbyte*>(buf[i]); assert(card_ptr != NULL, "invariant"); if (!cl->do_card_ptr(card_ptr, worker_i)) { ! result = false; // Incomplete processing. ! break; } } if (consume) { ! size_t new_index = DirtyCardQueue::index_to_byte_index(i); ! assert(new_index <= buffer_size(), "invariant"); ! node->set_index(new_index); } ! return result; } bool DirtyCardQueueSet::mut_process_buffer(BufferNode* node) { guarantee(_free_ids != NULL, "must be"); ! uint worker_i = _free_ids->claim_par_id(); // temporarily claim an id ! bool result = apply_closure_to_buffer(_mut_process_closure, node, true, worker_i); ! _free_ids->release_par_id(worker_i); // release the id ! if (result) { ! assert(node->index() == buffer_size(), "apply said fully consumed"); Atomic::inc(&_processed_buffers_mut); } ! return result; } BufferNode* DirtyCardQueueSet::get_completed_buffer(size_t stop_at) { BufferNode* nd = NULL;
*** 225,243 **** BufferNode* nd = get_completed_buffer(stop_at); if (nd == NULL) { return false; } else { if (apply_closure_to_buffer(cl, nd, true, worker_i)) { // Done with fully processed buffer. deallocate_buffer(nd); Atomic::inc(&_processed_buffers_rs_thread); - return true; } else { // Return partially processed buffer to the queue. enqueue_complete_buffer(nd); - return false; } } } void DirtyCardQueueSet::par_apply_closure_to_all_completed_buffers(CardTableEntryClosure* cl) { BufferNode* nd = _cur_par_buffer_node; --- 221,240 ---- BufferNode* nd = get_completed_buffer(stop_at); if (nd == NULL) { return false; } else { if (apply_closure_to_buffer(cl, nd, true, worker_i)) { + assert(nd->index() == buffer_size(), "apply said fully consumed"); // Done with fully processed buffer. deallocate_buffer(nd); Atomic::inc(&_processed_buffers_rs_thread); } else { // Return partially processed buffer to the queue. + guarantee(!during_pause, "Should never stop early"); enqueue_complete_buffer(nd); } + return true; } } void DirtyCardQueueSet::par_apply_closure_to_all_completed_buffers(CardTableEntryClosure* cl) { BufferNode* nd = _cur_par_buffer_node;
< prev index next >