154 // Reset flush counters
155 _work_nproactiveflush.store_relaxed(0u);
156 _work_nterminateflush.store_relaxed(0u);
157 }
158
159 void ZMark::finish_work() {
160 // Accumulate proactive/terminate flush counters
161 _nproactiveflush += _work_nproactiveflush.load_relaxed();
162 _nterminateflush += _work_nterminateflush.load_relaxed();
163 }
164
165 void ZMark::follow_work_complete() {
166 follow_work(false /* partial */);
167 }
168
169 bool ZMark::follow_work_partial() {
170 return follow_work(true /* partial */);
171 }
172
173 bool ZMark::is_array(zaddress addr) const {
174 return to_oop(addr)->is_objArray();
175 }
176
177 static uintptr_t encode_partial_array_offset(zpointer* addr) {
178 return untype(ZAddress::offset(to_zaddress((uintptr_t)addr))) >> ZMarkPartialArrayMinSizeShift;
179 }
180
181 static zpointer* decode_partial_array_offset(uintptr_t offset) {
182 return (zpointer*)ZOffset::address(to_zoffset(offset << ZMarkPartialArrayMinSizeShift));
183 }
184
185 void ZMark::push_partial_array(zpointer* addr, size_t length, bool finalizable) {
186 assert(is_aligned(addr, ZMarkPartialArrayMinSize), "Address misaligned");
187 ZMarkThreadLocalStacks* const stacks = ZThreadLocalData::mark_stacks(Thread::current(), _generation->id());
188 ZMarkStripe* const stripe = _stripes.stripe_for_addr((uintptr_t)addr);
189 const uintptr_t offset = encode_partial_array_offset(addr);
190 const ZMarkStackEntry entry(offset, length, finalizable);
191
192 log_develop_trace(gc, marking)("Array push partial: " PTR_FORMAT " (%zu), stripe: %zu",
193 p2i(addr), length, _stripes.stripe_id(stripe));
194
|
154 // Reset flush counters
155 _work_nproactiveflush.store_relaxed(0u);
156 _work_nterminateflush.store_relaxed(0u);
157 }
158
159 void ZMark::finish_work() {
160 // Accumulate proactive/terminate flush counters
161 _nproactiveflush += _work_nproactiveflush.load_relaxed();
162 _nterminateflush += _work_nterminateflush.load_relaxed();
163 }
164
165 void ZMark::follow_work_complete() {
166 follow_work(false /* partial */);
167 }
168
169 bool ZMark::follow_work_partial() {
170 return follow_work(true /* partial */);
171 }
172
173 bool ZMark::is_array(zaddress addr) const {
174 return to_oop(addr)->is_refArray();
175 }
176
177 static uintptr_t encode_partial_array_offset(zpointer* addr) {
178 return untype(ZAddress::offset(to_zaddress((uintptr_t)addr))) >> ZMarkPartialArrayMinSizeShift;
179 }
180
181 static zpointer* decode_partial_array_offset(uintptr_t offset) {
182 return (zpointer*)ZOffset::address(to_zoffset(offset << ZMarkPartialArrayMinSizeShift));
183 }
184
185 void ZMark::push_partial_array(zpointer* addr, size_t length, bool finalizable) {
186 assert(is_aligned(addr, ZMarkPartialArrayMinSize), "Address misaligned");
187 ZMarkThreadLocalStacks* const stacks = ZThreadLocalData::mark_stacks(Thread::current(), _generation->id());
188 ZMarkStripe* const stripe = _stripes.stripe_for_addr((uintptr_t)addr);
189 const uintptr_t offset = encode_partial_array_offset(addr);
190 const ZMarkStackEntry entry(offset, length, finalizable);
191
192 log_develop_trace(gc, marking)("Array push partial: " PTR_FORMAT " (%zu), stripe: %zu",
193 p2i(addr), length, _stripes.stripe_id(stripe));
194
|