219 return result; |
219 return result; |
220 } |
220 } |
221 |
221 |
222 |
222 |
223 BufferNode* DirtyCardQueueSet::get_completed_buffer(size_t stop_at) { |
223 BufferNode* DirtyCardQueueSet::get_completed_buffer(size_t stop_at) { |
224 BufferNode* nd = NULL; |
|
225 MutexLockerEx x(_cbl_mon, Mutex::_no_safepoint_check_flag); |
224 MutexLockerEx x(_cbl_mon, Mutex::_no_safepoint_check_flag); |
226 |
225 |
227 if (_n_completed_buffers <= stop_at) { |
226 if (_n_completed_buffers <= stop_at) { |
228 _process_completed = false; |
|
229 return NULL; |
227 return NULL; |
230 } |
228 } |
231 |
229 |
232 if (_completed_buffers_head != NULL) { |
230 assert(_n_completed_buffers > 0, "invariant"); |
233 nd = _completed_buffers_head; |
231 assert(_completed_buffers_head != NULL, "invariant"); |
234 assert(_n_completed_buffers > 0, "Invariant"); |
232 assert(_completed_buffers_tail != NULL, "invariant"); |
235 _completed_buffers_head = nd->next(); |
233 |
236 _n_completed_buffers--; |
234 BufferNode* nd = _completed_buffers_head; |
237 if (_completed_buffers_head == NULL) { |
235 _completed_buffers_head = nd->next(); |
238 assert(_n_completed_buffers == 0, "Invariant"); |
236 _n_completed_buffers--; |
239 _completed_buffers_tail = NULL; |
237 if (_completed_buffers_head == NULL) { |
240 } |
238 assert(_n_completed_buffers == 0, "Invariant"); |
|
239 _completed_buffers_tail = NULL; |
241 } |
240 } |
242 DEBUG_ONLY(assert_completed_buffer_list_len_correct_locked()); |
241 DEBUG_ONLY(assert_completed_buffer_list_len_correct_locked()); |
243 return nd; |
242 return nd; |
244 } |
243 } |
245 |
244 |