< prev index next >

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

Print this page
rev 47400 : [mq]: cmpxchg_ptr


 263     return false;
 264   } else {
 265     if (apply_closure_to_buffer(cl, nd, true, worker_i)) {
 266       assert_fully_consumed(nd, buffer_size());
 267       // Done with fully processed buffer.
 268       deallocate_buffer(nd);
 269       Atomic::inc(&_processed_buffers_rs_thread);
 270     } else {
 271       // Return partially processed buffer to the queue.
 272       guarantee(!during_pause, "Should never stop early");
 273       enqueue_complete_buffer(nd);
 274     }
 275     return true;
 276   }
 277 }
 278 
 279 void DirtyCardQueueSet::par_apply_closure_to_all_completed_buffers(CardTableEntryClosure* cl) {
 280   BufferNode* nd = _cur_par_buffer_node;
 281   while (nd != NULL) {
 282     BufferNode* next = nd->next();
 283     void* actual = Atomic::cmpxchg_ptr(next, &_cur_par_buffer_node, nd);
 284     if (actual == nd) {
 285       bool b = apply_closure_to_buffer(cl, nd, false);
 286       guarantee(b, "Should not stop early.");
 287       nd = next;
 288     } else {
 289       nd = static_cast<BufferNode*>(actual);
 290     }
 291   }
 292 }
 293 
 294 // Deallocates any completed log buffers
 295 void DirtyCardQueueSet::clear() {
 296   BufferNode* buffers_to_delete = NULL;
 297   {
 298     MutexLockerEx x(_cbl_mon, Mutex::_no_safepoint_check_flag);
 299     while (_completed_buffers_head != NULL) {
 300       BufferNode* nd = _completed_buffers_head;
 301       _completed_buffers_head = nd->next();
 302       nd->set_next(buffers_to_delete);
 303       buffers_to_delete = nd;




 263     return false;
 264   } else {
 265     if (apply_closure_to_buffer(cl, nd, true, worker_i)) {
 266       assert_fully_consumed(nd, buffer_size());
 267       // Done with fully processed buffer.
 268       deallocate_buffer(nd);
 269       Atomic::inc(&_processed_buffers_rs_thread);
 270     } else {
 271       // Return partially processed buffer to the queue.
 272       guarantee(!during_pause, "Should never stop early");
 273       enqueue_complete_buffer(nd);
 274     }
 275     return true;
 276   }
 277 }
 278 
 279 void DirtyCardQueueSet::par_apply_closure_to_all_completed_buffers(CardTableEntryClosure* cl) {
 280   BufferNode* nd = _cur_par_buffer_node;
 281   while (nd != NULL) {
 282     BufferNode* next = nd->next();
 283     void* actual = Atomic::cmpxchg(next, &_cur_par_buffer_node, nd);
 284     if (actual == nd) {
 285       bool b = apply_closure_to_buffer(cl, nd, false);
 286       guarantee(b, "Should not stop early.");
 287       nd = next;
 288     } else {
 289       nd = static_cast<BufferNode*>(actual);
 290     }
 291   }
 292 }
 293 
 294 // Deallocates any completed log buffers
 295 void DirtyCardQueueSet::clear() {
 296   BufferNode* buffers_to_delete = NULL;
 297   {
 298     MutexLockerEx x(_cbl_mon, Mutex::_no_safepoint_check_flag);
 299     while (_completed_buffers_head != NULL) {
 300       BufferNode* nd = _completed_buffers_head;
 301       _completed_buffers_head = nd->next();
 302       nd->set_next(buffers_to_delete);
 303       buffers_to_delete = nd;


< prev index next >