< prev index next >

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

Print this page




 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;


< prev index next >