src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp
changeset 54882 b99e97bc5040
parent 54786 ebf733a324d4
child 54985 37d8790efed7
equal deleted inserted replaced
54881:80991d58b947 54882:b99e97bc5040
   417 };
   417 };
   418 
   418 
   419 class ShenandoahVerifierReachableTask : public AbstractGangTask {
   419 class ShenandoahVerifierReachableTask : public AbstractGangTask {
   420 private:
   420 private:
   421   const char* _label;
   421   const char* _label;
   422   ShenandoahRootProcessor* _rp;
   422   ShenandoahRootVerifier* _verifier;
   423   ShenandoahVerifier::VerifyOptions _options;
   423   ShenandoahVerifier::VerifyOptions _options;
   424   ShenandoahHeap* _heap;
   424   ShenandoahHeap* _heap;
   425   ShenandoahLivenessData* _ld;
   425   ShenandoahLivenessData* _ld;
   426   MarkBitMap* _bitmap;
   426   MarkBitMap* _bitmap;
   427   volatile size_t _processed;
   427   volatile size_t _processed;
   428 
   428 
   429 public:
   429 public:
   430   ShenandoahVerifierReachableTask(MarkBitMap* bitmap,
   430   ShenandoahVerifierReachableTask(MarkBitMap* bitmap,
   431                                   ShenandoahLivenessData* ld,
   431                                   ShenandoahLivenessData* ld,
   432                                   ShenandoahRootProcessor* rp,
   432                                   ShenandoahRootVerifier* verifier,
   433                                   const char* label,
   433                                   const char* label,
   434                                   ShenandoahVerifier::VerifyOptions options) :
   434                                   ShenandoahVerifier::VerifyOptions options) :
   435     AbstractGangTask("Shenandoah Parallel Verifier Reachable Task"),
   435     AbstractGangTask("Shenandoah Parallel Verifier Reachable Task"),
   436     _label(label),
   436     _label(label),
   437     _rp(rp),
   437     _verifier(verifier),
   438     _options(options),
   438     _options(options),
   439     _heap(ShenandoahHeap::heap()),
   439     _heap(ShenandoahHeap::heap()),
   440     _ld(ld),
   440     _ld(ld),
   441     _bitmap(bitmap),
   441     _bitmap(bitmap),
   442     _processed(0) {};
   442     _processed(0) {};
   456     if (((ShenandoahVerifyLevel == 2) && (worker_id == 0))
   456     if (((ShenandoahVerifyLevel == 2) && (worker_id == 0))
   457         || (ShenandoahVerifyLevel >= 3)) {
   457         || (ShenandoahVerifyLevel >= 3)) {
   458         ShenandoahVerifyOopClosure cl(&stack, _bitmap, _ld,
   458         ShenandoahVerifyOopClosure cl(&stack, _bitmap, _ld,
   459                                       ShenandoahMessageBuffer("%s, Roots", _label),
   459                                       ShenandoahMessageBuffer("%s, Roots", _label),
   460                                       _options);
   460                                       _options);
   461         _rp->process_all_roots_slow(&cl);
   461         _verifier->oops_do(&cl);
   462     }
   462     }
   463 
   463 
   464     size_t processed = 0;
   464     size_t processed = 0;
   465 
   465 
   466     if (ShenandoahVerifyLevel >= 3) {
   466     if (ShenandoahVerifyLevel >= 3) {
   690 
   690 
   691   // Steps 1-2. Scan root set to get initial reachable set. Finish walking the reachable heap.
   691   // Steps 1-2. Scan root set to get initial reachable set. Finish walking the reachable heap.
   692   // This verifies what application can see, since it only cares about reachable objects.
   692   // This verifies what application can see, since it only cares about reachable objects.
   693   size_t count_reachable = 0;
   693   size_t count_reachable = 0;
   694   if (ShenandoahVerifyLevel >= 2) {
   694   if (ShenandoahVerifyLevel >= 2) {
   695     ShenandoahRootProcessor rp(_heap, _heap->workers()->active_workers(),
   695     ShenandoahRootVerifier verifier;
   696                                ShenandoahPhaseTimings::_num_phases); // no need for stats
   696 
   697 
   697     ShenandoahVerifierReachableTask task(_verification_bit_map, ld, &verifier, label, options);
   698     ShenandoahVerifierReachableTask task(_verification_bit_map, ld, &rp, label, options);
       
   699     _heap->workers()->run_task(&task);
   698     _heap->workers()->run_task(&task);
   700     count_reachable = task.processed();
   699     count_reachable = task.processed();
   701   }
   700   }
   702 
   701 
   703   // Step 3. Walk marked objects. Marked objects might be unreachable. This verifies what collector,
   702   // Step 3. Walk marked objects. Marked objects might be unreachable. This verifies what collector,
   941   void do_oop(oop* p)       { do_oop_work(p); }
   940   void do_oop(oop* p)       { do_oop_work(p); }
   942 };
   941 };
   943 
   942 
   944 void ShenandoahVerifier::verify_roots_no_forwarded() {
   943 void ShenandoahVerifier::verify_roots_no_forwarded() {
   945   guarantee(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "only when nothing else happens");
   944   guarantee(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "only when nothing else happens");
   946   ShenandoahRootProcessor rp(_heap, 1, ShenandoahPhaseTimings::_num_phases); // no need for stats
   945   ShenandoahRootVerifier verifier;
   947   ShenandoahVerifyNoForwared cl;
   946   ShenandoahVerifyNoForwared cl;
   948   rp.process_all_roots_slow(&cl);
   947   verifier.oops_do(&cl);
   949 }
   948 }
       
   949 
       
   950 void ShenandoahVerifier::verify_roots_no_forwarded_except(ShenandoahRootVerifier::RootTypes types) {
       
   951   guarantee(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "only when nothing else happens");
       
   952   ShenandoahRootVerifier verifier;
       
   953   verifier.excludes(types);
       
   954   ShenandoahVerifyNoForwared cl;
       
   955   verifier.oops_do(&cl);
       
   956 }