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) {
|