src/share/vm/gc_implementation/g1/dirtyCardQueue.cpp
Print this page
*** 153,163 ****
}
return b;
}
DirtyCardQueueSet::CompletedBufferNode*
! DirtyCardQueueSet::get_completed_buffer_lock(int stop_at) {
CompletedBufferNode* nd = NULL;
MutexLockerEx x(_cbl_mon, Mutex::_no_safepoint_check_flag);
if ((int)_n_completed_buffers <= stop_at) {
_process_completed = false;
--- 153,163 ----
}
return b;
}
DirtyCardQueueSet::CompletedBufferNode*
! DirtyCardQueueSet::get_completed_buffer(int stop_at) {
CompletedBufferNode* nd = NULL;
MutexLockerEx x(_cbl_mon, Mutex::_no_safepoint_check_flag);
if ((int)_n_completed_buffers <= stop_at) {
_process_completed = false;
*** 173,204 ****
}
debug_only(assert_completed_buffer_list_len_correct_locked());
return nd;
}
- // We only do this in contexts where there is no concurrent enqueueing.
- DirtyCardQueueSet::CompletedBufferNode*
- DirtyCardQueueSet::get_completed_buffer_CAS() {
- CompletedBufferNode* nd = _completed_buffers_head;
-
- while (nd != NULL) {
- CompletedBufferNode* next = nd->next;
- CompletedBufferNode* result =
- (CompletedBufferNode*)Atomic::cmpxchg_ptr(next,
- &_completed_buffers_head,
- nd);
- if (result == nd) {
- return result;
- } else {
- nd = _completed_buffers_head;
- }
- }
- assert(_completed_buffers_head == NULL, "Loop post");
- _completed_buffers_tail = NULL;
- return NULL;
- }
-
bool DirtyCardQueueSet::
apply_closure_to_completed_buffer_helper(int worker_i,
CompletedBufferNode* nd) {
if (nd != NULL) {
bool b =
--- 173,182 ----
*** 220,238 ****
}
}
bool DirtyCardQueueSet::apply_closure_to_completed_buffer(int worker_i,
int stop_at,
! bool with_CAS)
{
! CompletedBufferNode* nd = NULL;
! if (with_CAS) {
! guarantee(stop_at == 0, "Precondition");
! nd = get_completed_buffer_CAS();
! } else {
! nd = get_completed_buffer_lock(stop_at);
}
bool res = apply_closure_to_completed_buffer_helper(worker_i, nd);
if (res) Atomic::inc(&_processed_buffers_rs_thread);
return res;
}
--- 198,214 ----
}
}
bool DirtyCardQueueSet::apply_closure_to_completed_buffer(int worker_i,
int stop_at,
! bool during_pause)
{
! if (during_pause) {
! guarantee(stop_at == 0, "should be");
}
+
+ CompletedBufferNode* nd = get_completed_buffer(stop_at);
bool res = apply_closure_to_completed_buffer_helper(worker_i, nd);
if (res) Atomic::inc(&_processed_buffers_rs_thread);
return res;
}