< prev index next >

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

Print this page




  26 #include "gc/g1/g1CollectedHeap.inline.hpp"
  27 #include "gc/g1/g1SATBCardTableModRefBS.inline.hpp"
  28 #include "gc/g1/heapRegion.hpp"
  29 #include "gc/g1/satbMarkQueue.hpp"
  30 #include "gc/shared/memset_with_concurrent_readers.hpp"
  31 #include "logging/log.hpp"
  32 #include "oops/oop.inline.hpp"
  33 #include "runtime/atomic.hpp"
  34 #include "runtime/mutexLocker.hpp"
  35 #include "runtime/orderAccess.inline.hpp"
  36 #include "runtime/thread.inline.hpp"
  37 
  38 G1SATBCardTableModRefBS::G1SATBCardTableModRefBS(
  39   MemRegion whole_heap,
  40   const BarrierSet::FakeRtti& fake_rtti) :
  41   CardTableModRefBS(whole_heap, fake_rtti.add_tag(BarrierSet::G1SATBCT))
  42 { }
  43 
  44 void G1SATBCardTableModRefBS::enqueue(oop pre_val) {
  45   // Nulls should have been already filtered.
  46   assert(pre_val->is_oop(true), "Error");
  47 
  48   if (!JavaThread::satb_mark_queue_set().is_active()) return;
  49   Thread* thr = Thread::current();
  50   if (thr->is_Java_thread()) {
  51     JavaThread* jt = (JavaThread*)thr;
  52     jt->satb_mark_queue().enqueue(pre_val);
  53   } else {
  54     MutexLockerEx x(Shared_SATB_Q_lock, Mutex::_no_safepoint_check_flag);
  55     JavaThread::satb_mark_queue_set().shared_satb_queue()->enqueue(pre_val);
  56   }
  57 }
  58 
  59 template <class T> void
  60 G1SATBCardTableModRefBS::write_ref_array_pre_work(T* dst, int count) {
  61   if (!JavaThread::satb_mark_queue_set().is_active()) return;
  62   T* elem_ptr = dst;
  63   for (int i = 0; i < count; i++, elem_ptr++) {
  64     T heap_oop = oopDesc::load_heap_oop(elem_ptr);
  65     if (!oopDesc::is_null(heap_oop)) {
  66       enqueue(oopDesc::decode_heap_oop_not_null(heap_oop));




  26 #include "gc/g1/g1CollectedHeap.inline.hpp"
  27 #include "gc/g1/g1SATBCardTableModRefBS.inline.hpp"
  28 #include "gc/g1/heapRegion.hpp"
  29 #include "gc/g1/satbMarkQueue.hpp"
  30 #include "gc/shared/memset_with_concurrent_readers.hpp"
  31 #include "logging/log.hpp"
  32 #include "oops/oop.inline.hpp"
  33 #include "runtime/atomic.hpp"
  34 #include "runtime/mutexLocker.hpp"
  35 #include "runtime/orderAccess.inline.hpp"
  36 #include "runtime/thread.inline.hpp"
  37 
  38 G1SATBCardTableModRefBS::G1SATBCardTableModRefBS(
  39   MemRegion whole_heap,
  40   const BarrierSet::FakeRtti& fake_rtti) :
  41   CardTableModRefBS(whole_heap, fake_rtti.add_tag(BarrierSet::G1SATBCT))
  42 { }
  43 
  44 void G1SATBCardTableModRefBS::enqueue(oop pre_val) {
  45   // Nulls should have been already filtered.
  46   assert(oopDesc::is_oop(pre_val, true), "Error");
  47 
  48   if (!JavaThread::satb_mark_queue_set().is_active()) return;
  49   Thread* thr = Thread::current();
  50   if (thr->is_Java_thread()) {
  51     JavaThread* jt = (JavaThread*)thr;
  52     jt->satb_mark_queue().enqueue(pre_val);
  53   } else {
  54     MutexLockerEx x(Shared_SATB_Q_lock, Mutex::_no_safepoint_check_flag);
  55     JavaThread::satb_mark_queue_set().shared_satb_queue()->enqueue(pre_val);
  56   }
  57 }
  58 
  59 template <class T> void
  60 G1SATBCardTableModRefBS::write_ref_array_pre_work(T* dst, int count) {
  61   if (!JavaThread::satb_mark_queue_set().is_active()) return;
  62   T* elem_ptr = dst;
  63   for (int i = 0; i < count; i++, elem_ptr++) {
  64     T heap_oop = oopDesc::load_heap_oop(elem_ptr);
  65     if (!oopDesc::is_null(heap_oop)) {
  66       enqueue(oopDesc::decode_heap_oop_not_null(heap_oop));


< prev index next >