src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp
changeset 59249 29b0d0b61615
parent 59247 56bf71d64d51
child 59290 97d13893ec3c
equal deleted inserted replaced
59248:e92153ed8bdc 59249:29b0d0b61615
   137       switch (_options._verify_liveness) {
   137       switch (_options._verify_liveness) {
   138         case ShenandoahVerifier::_verify_liveness_disable:
   138         case ShenandoahVerifier::_verify_liveness_disable:
   139           // skip
   139           // skip
   140           break;
   140           break;
   141         case ShenandoahVerifier::_verify_liveness_complete:
   141         case ShenandoahVerifier::_verify_liveness_complete:
   142           Atomic::add((uint) obj->size(), &_ld[obj_reg->region_number()]);
   142           Atomic::add(&_ld[obj_reg->region_number()], (uint) obj->size());
   143           // fallthrough for fast failure for un-live regions:
   143           // fallthrough for fast failure for un-live regions:
   144         case ShenandoahVerifier::_verify_liveness_conservative:
   144         case ShenandoahVerifier::_verify_liveness_conservative:
   145           check(ShenandoahAsserts::_safe_oop, obj, obj_reg->has_live(),
   145           check(ShenandoahAsserts::_safe_oop, obj, obj_reg->has_live(),
   146                    "Object must belong to region with live data");
   146                    "Object must belong to region with live data");
   147           break;
   147           break;
   477         ShenandoahVerifierTask task = stack.pop();
   477         ShenandoahVerifierTask task = stack.pop();
   478         cl.verify_oops_from(task.obj());
   478         cl.verify_oops_from(task.obj());
   479       }
   479       }
   480     }
   480     }
   481 
   481 
   482     Atomic::add(processed, &_processed);
   482     Atomic::add(&_processed, processed);
   483   }
   483   }
   484 };
   484 };
   485 
   485 
   486 class ShenandoahVerifierMarkedRegionTask : public AbstractGangTask {
   486 class ShenandoahVerifierMarkedRegionTask : public AbstractGangTask {
   487 private:
   487 private:
   516     ShenandoahVerifyOopClosure cl(&stack, _bitmap, _ld,
   516     ShenandoahVerifyOopClosure cl(&stack, _bitmap, _ld,
   517                                   ShenandoahMessageBuffer("%s, Marked", _label),
   517                                   ShenandoahMessageBuffer("%s, Marked", _label),
   518                                   _options);
   518                                   _options);
   519 
   519 
   520     while (true) {
   520     while (true) {
   521       size_t v = Atomic::add(1u, &_claimed) - 1;
   521       size_t v = Atomic::add(&_claimed, 1u) - 1;
   522       if (v < _heap->num_regions()) {
   522       if (v < _heap->num_regions()) {
   523         ShenandoahHeapRegion* r = _heap->get_region(v);
   523         ShenandoahHeapRegion* r = _heap->get_region(v);
   524         if (!r->is_humongous() && !r->is_trash()) {
   524         if (!r->is_humongous() && !r->is_trash()) {
   525           work_regular(r, stack, cl);
   525           work_regular(r, stack, cl);
   526         } else if (r->is_humongous_start()) {
   526         } else if (r->is_humongous_start()) {
   536     size_t processed = 0;
   536     size_t processed = 0;
   537     HeapWord* obj = r->bottom();
   537     HeapWord* obj = r->bottom();
   538     if (_heap->complete_marking_context()->is_marked((oop)obj)) {
   538     if (_heap->complete_marking_context()->is_marked((oop)obj)) {
   539       verify_and_follow(obj, stack, cl, &processed);
   539       verify_and_follow(obj, stack, cl, &processed);
   540     }
   540     }
   541     Atomic::add(processed, &_processed);
   541     Atomic::add(&_processed, processed);
   542   }
   542   }
   543 
   543 
   544   virtual void work_regular(ShenandoahHeapRegion *r, ShenandoahVerifierStack &stack, ShenandoahVerifyOopClosure &cl) {
   544   virtual void work_regular(ShenandoahHeapRegion *r, ShenandoahVerifierStack &stack, ShenandoahVerifyOopClosure &cl) {
   545     size_t processed = 0;
   545     size_t processed = 0;
   546     MarkBitMap* mark_bit_map = _heap->complete_marking_context()->mark_bit_map();
   546     MarkBitMap* mark_bit_map = _heap->complete_marking_context()->mark_bit_map();
   569         verify_and_follow(addr, stack, cl, &processed);
   569         verify_and_follow(addr, stack, cl, &processed);
   570         addr += oop(addr)->size();
   570         addr += oop(addr)->size();
   571       }
   571       }
   572     }
   572     }
   573 
   573 
   574     Atomic::add(processed, &_processed);
   574     Atomic::add(&_processed, processed);
   575   }
   575   }
   576 
   576 
   577   void verify_and_follow(HeapWord *addr, ShenandoahVerifierStack &stack, ShenandoahVerifyOopClosure &cl, size_t *processed) {
   577   void verify_and_follow(HeapWord *addr, ShenandoahVerifierStack &stack, ShenandoahVerifyOopClosure &cl, size_t *processed) {
   578     if (!_bitmap->par_mark(addr)) return;
   578     if (!_bitmap->par_mark(addr)) return;
   579 
   579