539 if (work == 0) {
540 // No more work, try to terminate
541 ShenandoahEvacOOMScopeLeaver oom_scope_leaver;
542 ShenandoahSuspendibleThreadSetLeaver stsl(sts_yield && ShenandoahSuspendibleWorkers);
543 ShenandoahTerminationTimingsTracker term_tracker(worker_id);
544 ShenandoahTerminatorTerminator tt(_heap);
545
546 if (terminator->offer_termination(&tt)) return;
547 }
548 }
549 }
550
551 bool ShenandoahTraversalGC::check_and_handle_cancelled_gc(ShenandoahTaskTerminator* terminator, bool sts_yield) {
552 if (_heap->cancelled_gc()) {
553 return true;
554 }
555 return false;
556 }
557
558 void ShenandoahTraversalGC::concurrent_traversal_collection() {
559 {
560 MutexLocker ml(ClassLoaderDataGraph_lock);
561 ClassLoaderDataGraph::clear_claimed_marks();
562 }
563
564 ShenandoahGCPhase phase_work(ShenandoahPhaseTimings::conc_traversal);
565 if (!_heap->cancelled_gc()) {
566 uint nworkers = _heap->workers()->active_workers();
567 task_queues()->reserve(nworkers);
568 ShenandoahTerminationTracker tracker(ShenandoahPhaseTimings::conc_traversal_termination);
569
570 ShenandoahTaskTerminator terminator(nworkers, task_queues());
571 ShenandoahConcurrentTraversalCollectionTask task(&terminator);
572 _heap->workers()->run_task(&task);
573 }
574
575 if (!_heap->cancelled_gc() && ShenandoahPreclean && _heap->process_references()) {
576 preclean_weak_refs();
577 }
578 }
579
580 void ShenandoahTraversalGC::final_traversal_collection() {
581 _heap->make_parsable(true);
582
583 if (!_heap->cancelled_gc()) {
|
539 if (work == 0) {
540 // No more work, try to terminate
541 ShenandoahEvacOOMScopeLeaver oom_scope_leaver;
542 ShenandoahSuspendibleThreadSetLeaver stsl(sts_yield && ShenandoahSuspendibleWorkers);
543 ShenandoahTerminationTimingsTracker term_tracker(worker_id);
544 ShenandoahTerminatorTerminator tt(_heap);
545
546 if (terminator->offer_termination(&tt)) return;
547 }
548 }
549 }
550
551 bool ShenandoahTraversalGC::check_and_handle_cancelled_gc(ShenandoahTaskTerminator* terminator, bool sts_yield) {
552 if (_heap->cancelled_gc()) {
553 return true;
554 }
555 return false;
556 }
557
558 void ShenandoahTraversalGC::concurrent_traversal_collection() {
559 ShenandoahGCPhase phase_work(ShenandoahPhaseTimings::conc_traversal);
560 if (!_heap->cancelled_gc()) {
561 uint nworkers = _heap->workers()->active_workers();
562 task_queues()->reserve(nworkers);
563 ShenandoahTerminationTracker tracker(ShenandoahPhaseTimings::conc_traversal_termination);
564
565 ShenandoahTaskTerminator terminator(nworkers, task_queues());
566 ShenandoahConcurrentTraversalCollectionTask task(&terminator);
567 _heap->workers()->run_task(&task);
568 }
569
570 if (!_heap->cancelled_gc() && ShenandoahPreclean && _heap->process_references()) {
571 preclean_weak_refs();
572 }
573 }
574
575 void ShenandoahTraversalGC::final_traversal_collection() {
576 _heap->make_parsable(true);
577
578 if (!_heap->cancelled_gc()) {
|