--- old/src/share/vm/gc/g1/g1ConcurrentMark.cpp 2017-03-21 16:20:13.690067297 -0400 +++ new/src/share/vm/gc/g1/g1ConcurrentMark.cpp 2017-03-21 16:20:12.461996350 -0400 @@ -646,7 +646,7 @@ ShouldNotReachHere(); } -class G1ClearBitMapTask : public AbstractGangTask { +class G1ClearBitMapTask : public G1ParallelizeByRegionsTask { public: static size_t chunk_size() { return M; } @@ -690,20 +690,18 @@ }; G1ClearBitmapHRClosure _cl; - HeapRegionClaimer _hr_claimer; bool _suspendible; // If the task is suspendible, workers must join the STS. public: G1ClearBitMapTask(G1CMBitMap* bitmap, G1ConcurrentMark* cm, uint n_workers, bool suspendible) : - AbstractGangTask("G1 Clear Bitmap"), + G1ParallelizeByRegionsTask("G1 Clear Bitmap", n_workers), _cl(bitmap, suspendible ? cm : NULL), - _hr_claimer(n_workers), _suspendible(suspendible) { } void work(uint worker_id) { SuspendibleThreadSetJoiner sts_join(_suspendible); - G1CollectedHeap::heap()->heap_region_par_iterate(&_cl, worker_id, &_hr_claimer, true); + all_heap_regions_work(&_cl, worker_id, true); } bool is_complete() { @@ -1175,65 +1173,62 @@ _gc_tracer_cm->report_object_count_after_gc(&is_alive); } -class G1NoteEndOfConcMarkClosure : public HeapRegionClosure { - G1CollectedHeap* _g1; - size_t _freed_bytes; - FreeRegionList* _local_cleanup_list; - uint _old_regions_removed; - uint _humongous_regions_removed; - HRRSCleanupTask* _hrrs_cleanup_task; +class G1ParNoteEndTask: public G1ParallelizeByRegionsTask { + class G1NoteEndOfConcMarkClosure : public HeapRegionClosure { + G1CollectedHeap* _g1; + size_t _freed_bytes; + FreeRegionList* _local_cleanup_list; + uint _old_regions_removed; + uint _humongous_regions_removed; + HRRSCleanupTask* _hrrs_cleanup_task; -public: - G1NoteEndOfConcMarkClosure(G1CollectedHeap* g1, - FreeRegionList* local_cleanup_list, - HRRSCleanupTask* hrrs_cleanup_task) : - _g1(g1), - _freed_bytes(0), - _local_cleanup_list(local_cleanup_list), - _old_regions_removed(0), - _humongous_regions_removed(0), - _hrrs_cleanup_task(hrrs_cleanup_task) { } - - size_t freed_bytes() { return _freed_bytes; } - const uint old_regions_removed() { return _old_regions_removed; } - const uint humongous_regions_removed() { return _humongous_regions_removed; } - - bool doHeapRegion(HeapRegion *hr) { - if (hr->is_archive()) { - return false; - } - _g1->reset_gc_time_stamps(hr); - hr->note_end_of_marking(); + public: + G1NoteEndOfConcMarkClosure(G1CollectedHeap* g1, + FreeRegionList* local_cleanup_list, + HRRSCleanupTask* hrrs_cleanup_task) : + _g1(g1), + _freed_bytes(0), + _local_cleanup_list(local_cleanup_list), + _old_regions_removed(0), + _humongous_regions_removed(0), + _hrrs_cleanup_task(hrrs_cleanup_task) { } + + size_t freed_bytes() { return _freed_bytes; } + const uint old_regions_removed() { return _old_regions_removed; } + const uint humongous_regions_removed() { return _humongous_regions_removed; } + + bool doHeapRegion(HeapRegion *hr) { + if (hr->is_archive()) { + return false; + } + _g1->reset_gc_time_stamps(hr); + hr->note_end_of_marking(); - if (hr->used() > 0 && hr->max_live_bytes() == 0 && !hr->is_young()) { - _freed_bytes += hr->used(); - hr->set_containing_set(NULL); - if (hr->is_humongous()) { - _humongous_regions_removed++; - _g1->free_humongous_region(hr, _local_cleanup_list, true /* skip_remset */); + if (hr->used() > 0 && hr->max_live_bytes() == 0 && !hr->is_young()) { + _freed_bytes += hr->used(); + hr->set_containing_set(NULL); + if (hr->is_humongous()) { + _humongous_regions_removed++; + _g1->free_humongous_region(hr, _local_cleanup_list, true /* skip_remset */); + } else { + _old_regions_removed++; + _g1->free_region(hr, _local_cleanup_list, true /* skip_remset */); + } } else { - _old_regions_removed++; - _g1->free_region(hr, _local_cleanup_list, true /* skip_remset */); + hr->rem_set()->do_cleanup_work(_hrrs_cleanup_task); } - } else { - hr->rem_set()->do_cleanup_work(_hrrs_cleanup_task); - } - return false; - } -}; - -class G1ParNoteEndTask: public AbstractGangTask { - friend class G1NoteEndOfConcMarkClosure; + return false; + } + }; protected: G1CollectedHeap* _g1h; FreeRegionList* _cleanup_list; - HeapRegionClaimer _hrclaimer; public: G1ParNoteEndTask(G1CollectedHeap* g1h, FreeRegionList* cleanup_list, uint n_workers) : - AbstractGangTask("G1 note end"), _g1h(g1h), _cleanup_list(cleanup_list), _hrclaimer(n_workers) { + G1ParallelizeByRegionsTask("G1 note end", n_workers), _g1h(g1h), _cleanup_list(cleanup_list) { } void work(uint worker_id) { @@ -1241,7 +1236,7 @@ HRRSCleanupTask hrrs_cleanup_task; G1NoteEndOfConcMarkClosure g1_note_end(_g1h, &local_cleanup_list, &hrrs_cleanup_task); - _g1h->heap_region_par_iterate(&g1_note_end, worker_id, &_hrclaimer); + all_heap_regions_work(&g1_note_end, worker_id ); assert(g1_note_end.complete(), "Shouldn't have yielded!"); // Now update the lists