bool DirtyCardQueue::apply_closure(CardTableEntryClosure* cl, bool consume, size_t worker_i) { bool res = true; if (_buf != NULL) { res = apply_closure_to_buffer(cl, _buf, _index, _sz, consume, (int) worker_i); if (res && consume) _index = _sz; } return res; }
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_fully_consumed(node, buffer_size()); Atomic::inc(&_processed_buffers_mut); } return result; }
void DirtyCardQueueSet::par_apply_closure_to_all_completed_buffers(CardTableEntryClosure* cl) { BufferNode* nd = _cur_par_buffer_node; while (nd != NULL) { BufferNode* next = nd->next(); void* actual = Atomic::cmpxchg_ptr(next, &_cur_par_buffer_node, nd); if (actual == nd) { bool b = apply_closure_to_buffer(cl, nd, false); guarantee(b, "Should not stop early."); nd = next; } else { nd = static_cast<BufferNode*>(actual); } } }
bool DirtyCardQueueSet::apply_closure_to_completed_buffer(CardTableEntryClosure* cl, uint worker_i, size_t stop_at, bool during_pause) { assert(!during_pause || stop_at == 0, "Should not leave any completed buffers during a pause"); BufferNode* nd = get_completed_buffer(stop_at); if (nd == NULL) { return false; } else { if (apply_closure_to_buffer(cl, nd, true, worker_i)) { assert_fully_consumed(nd, buffer_size()); // 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 ObjPtrQueue::apply_closure(ObjectClosure* cl) { if (_buf != NULL) { apply_closure_to_buffer(cl, _buf, _index, _sz); _index = _sz; } }