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 } |