< prev index next >

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

Print this page




 203       MutexLockerEx x(Shared_DirtyCardQ_lock,
 204                       Mutex::_no_safepoint_check_flag);
 205       for (; byte <= last_byte; byte++) {
 206         if (*byte == g1_young_gen) {
 207           continue;
 208         }
 209         if (*byte != dirty_card) {
 210           *byte = dirty_card;
 211           _dcqs.shared_dirty_card_queue()->enqueue(byte);
 212         }
 213       }
 214     }
 215   }
 216 }
 217 
 218 bool G1SATBCardTableModRefBS::is_in_young(oop obj) const {
 219   volatile jbyte* p = byte_for((void*)obj);
 220   return *p == g1_young_card_val();
 221 }
 222 
 223 void G1SATBCardTableLoggingModRefBS::flush_deferred_barriers(JavaThread* thread) {
 224   CardTableModRefBS::flush_deferred_barriers(thread);































 225   thread->satb_mark_queue().flush();
 226   thread->dirty_card_queue().flush();
 227 }


 203       MutexLockerEx x(Shared_DirtyCardQ_lock,
 204                       Mutex::_no_safepoint_check_flag);
 205       for (; byte <= last_byte; byte++) {
 206         if (*byte == g1_young_gen) {
 207           continue;
 208         }
 209         if (*byte != dirty_card) {
 210           *byte = dirty_card;
 211           _dcqs.shared_dirty_card_queue()->enqueue(byte);
 212         }
 213       }
 214     }
 215   }
 216 }
 217 
 218 bool G1SATBCardTableModRefBS::is_in_young(oop obj) const {
 219   volatile jbyte* p = byte_for((void*)obj);
 220   return *p == g1_young_card_val();
 221 }
 222 
 223 void G1SATBCardTableLoggingModRefBS::on_thread_create(JavaThread* thread) {
 224   // This method initializes the SATB and dirty card queues before a
 225   // JavaThread is added to the Java thread list. Right now, we don't
 226   // have to do anything to the dirty card queue (it should have been
 227   // activated when the thread was created), but we have to activate
 228   // the SATB queue if the thread is created while a marking cycle is
 229   // in progress. The activation / de-activation of the SATB queues at
 230   // the beginning / end of a marking cycle is done during safepoints
 231   // so we have to make sure this method is called outside one to be
 232   // able to safely read the active field of the SATB queue set. Right
 233   // now, it is called just before the thread is added to the Java
 234   // thread list in the Threads::add() method. That method is holding
 235   // the Threads_lock which ensures we are outside a safepoint. We
 236   // cannot do the obvious and set the active field of the SATB queue
 237   // when the thread is created given that, in some cases, safepoints
 238   // might happen between the JavaThread constructor being called and the
 239   // thread being added to the Java thread list (an example of this is
 240   // when the structure for the DestroyJavaVM thread is created).
 241   assert(!SafepointSynchronize::is_at_safepoint(), "We should not be at a safepoint");
 242   assert(!thread->satb_mark_queue().is_active(), "SATB queue should not be active");
 243   assert(thread->satb_mark_queue().is_empty(), "SATB queue should be empty");
 244   assert(thread->dirty_card_queue().is_active(), "Dirty card queue should be active");
 245 
 246   // If we are creating the thread during a marking cycle, we should
 247   // set the active field of the SATB queue to true.
 248   if (thread->satb_mark_queue_set().is_active()) {
 249     thread->satb_mark_queue().set_active(true);
 250   }
 251 }
 252 
 253 void G1SATBCardTableLoggingModRefBS::on_thread_destroy(JavaThread* thread) {
 254   // Flush any deferred card marks, SATB buffers and dirty card queue buffers
 255   CardTableModRefBS::on_thread_destroy(thread);
 256   thread->satb_mark_queue().flush();
 257   thread->dirty_card_queue().flush();
 258 }
< prev index next >