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; }