299 }
300
301 void ZReferenceProcessor::work() {
302 // Process discovered references
303 oop* const list = _discovered_list.addr();
304 oop* p = list;
305
306 while (*p != NULL) {
307 const oop reference = *p;
308 const ReferenceType type = reference_type(reference);
309
310 if (should_drop(reference, type)) {
311 *p = drop(reference, type);
312 } else {
313 p = keep(reference, type);
314 }
315 }
316
317 // Prepend discovered references to internal pending list
318 if (*list != NULL) {
319 *p = Atomic::xchg(*list, _pending_list.addr());
320 if (*p == NULL) {
321 // First to prepend to list, record tail
322 _pending_list_tail = p;
323 }
324
325 // Clear discovered list
326 *list = NULL;
327 }
328 }
329
330 bool ZReferenceProcessor::is_empty() const {
331 ZPerWorkerConstIterator<oop> iter(&_discovered_list);
332 for (const oop* list; iter.next(&list);) {
333 if (*list != NULL) {
334 return false;
335 }
336 }
337
338 if (_pending_list.get() != NULL) {
339 return false;
|
299 }
300
301 void ZReferenceProcessor::work() {
302 // Process discovered references
303 oop* const list = _discovered_list.addr();
304 oop* p = list;
305
306 while (*p != NULL) {
307 const oop reference = *p;
308 const ReferenceType type = reference_type(reference);
309
310 if (should_drop(reference, type)) {
311 *p = drop(reference, type);
312 } else {
313 p = keep(reference, type);
314 }
315 }
316
317 // Prepend discovered references to internal pending list
318 if (*list != NULL) {
319 *p = Atomic::xchg(_pending_list.addr(), *list);
320 if (*p == NULL) {
321 // First to prepend to list, record tail
322 _pending_list_tail = p;
323 }
324
325 // Clear discovered list
326 *list = NULL;
327 }
328 }
329
330 bool ZReferenceProcessor::is_empty() const {
331 ZPerWorkerConstIterator<oop> iter(&_discovered_list);
332 for (const oop* list; iter.next(&list);) {
333 if (*list != NULL) {
334 return false;
335 }
336 }
337
338 if (_pending_list.get() != NULL) {
339 return false;
|