< prev index next >

src/hotspot/share/gc/z/zLiveMap.cpp

Print this page




  41 
  42 ZLiveMap::ZLiveMap(uint32_t size) :
  43     _seqnum(0),
  44     _live_objects(0),
  45     _live_bytes(0),
  46     _segment_live_bits(0),
  47     _segment_claim_bits(0),
  48     _bitmap(bitmap_size(size, nsegments)),
  49     _segment_shift(exact_log2(segment_size())) {}
  50 
  51 void ZLiveMap::reset(size_t index) {
  52   const uint32_t seqnum_initializing = (uint32_t)-1;
  53   bool contention = false;
  54 
  55   // Multiple threads can enter here, make sure only one of them
  56   // resets the marking information while the others busy wait.
  57   for (uint32_t seqnum = Atomic::load_acquire(&_seqnum);
  58        seqnum != ZGlobalSeqNum;
  59        seqnum = Atomic::load_acquire(&_seqnum)) {
  60     if ((seqnum != seqnum_initializing) &&
  61         (Atomic::cmpxchg(seqnum_initializing, &_seqnum, seqnum) == seqnum)) {
  62       // Reset marking information
  63       _live_bytes = 0;
  64       _live_objects = 0;
  65 
  66       // Clear segment claimed/live bits
  67       segment_live_bits().clear();
  68       segment_claim_bits().clear();
  69 
  70       assert(_seqnum == seqnum_initializing, "Invalid");
  71 
  72       // Make sure the newly reset marking information is ordered
  73       // before the update of the page seqnum, such that when the
  74       // up-to-date seqnum is load acquired, the bit maps will not
  75       // contain stale information.
  76       Atomic::release_store(&_seqnum, ZGlobalSeqNum);
  77       break;
  78     }
  79 
  80     // Mark reset contention
  81     if (!contention) {




  41 
  42 ZLiveMap::ZLiveMap(uint32_t size) :
  43     _seqnum(0),
  44     _live_objects(0),
  45     _live_bytes(0),
  46     _segment_live_bits(0),
  47     _segment_claim_bits(0),
  48     _bitmap(bitmap_size(size, nsegments)),
  49     _segment_shift(exact_log2(segment_size())) {}
  50 
  51 void ZLiveMap::reset(size_t index) {
  52   const uint32_t seqnum_initializing = (uint32_t)-1;
  53   bool contention = false;
  54 
  55   // Multiple threads can enter here, make sure only one of them
  56   // resets the marking information while the others busy wait.
  57   for (uint32_t seqnum = Atomic::load_acquire(&_seqnum);
  58        seqnum != ZGlobalSeqNum;
  59        seqnum = Atomic::load_acquire(&_seqnum)) {
  60     if ((seqnum != seqnum_initializing) &&
  61         (Atomic::cmpxchg(&_seqnum, seqnum, seqnum_initializing) == seqnum)) {
  62       // Reset marking information
  63       _live_bytes = 0;
  64       _live_objects = 0;
  65 
  66       // Clear segment claimed/live bits
  67       segment_live_bits().clear();
  68       segment_claim_bits().clear();
  69 
  70       assert(_seqnum == seqnum_initializing, "Invalid");
  71 
  72       // Make sure the newly reset marking information is ordered
  73       // before the update of the page seqnum, such that when the
  74       // up-to-date seqnum is load acquired, the bit maps will not
  75       // contain stale information.
  76       Atomic::release_store(&_seqnum, ZGlobalSeqNum);
  77       break;
  78     }
  79 
  80     // Mark reset contention
  81     if (!contention) {


< prev index next >