src/share/vm/gc/g1/g1ConcurrentMark.cpp
Print this page
*** 644,654 ****
G1ConcurrentMark::~G1ConcurrentMark() {
// The G1ConcurrentMark instance is never freed.
ShouldNotReachHere();
}
! class G1ClearBitMapTask : public AbstractGangTask {
public:
static size_t chunk_size() { return M; }
private:
// Heap region closure used for clearing the given mark bitmap.
--- 644,654 ----
G1ConcurrentMark::~G1ConcurrentMark() {
// The G1ConcurrentMark instance is never freed.
ShouldNotReachHere();
}
! class G1ClearBitMapTask : public G1ParallelizeByRegionsTask {
public:
static size_t chunk_size() { return M; }
private:
// Heap region closure used for clearing the given mark bitmap.
*** 688,711 ****
return false;
}
};
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"),
_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);
}
bool is_complete() {
return _cl.complete();
}
--- 688,709 ----
return false;
}
};
G1ClearBitmapHRClosure _cl;
bool _suspendible; // If the task is suspendible, workers must join the STS.
public:
G1ClearBitMapTask(G1CMBitMap* bitmap, G1ConcurrentMark* cm, uint n_workers, bool suspendible) :
! G1ParallelizeByRegionsTask("G1 Clear Bitmap", n_workers),
_cl(bitmap, suspendible ? cm : NULL),
_suspendible(suspendible)
{ }
void work(uint worker_id) {
SuspendibleThreadSetJoiner sts_join(_suspendible);
! all_heap_regions_work(&_cl, worker_id, true);
}
bool is_complete() {
return _cl.complete();
}
*** 1173,1191 ****
G1CMIsAliveClosure is_alive(g1h);
_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;
! public:
G1NoteEndOfConcMarkClosure(G1CollectedHeap* g1,
FreeRegionList* local_cleanup_list,
HRRSCleanupTask* hrrs_cleanup_task) :
_g1(g1),
_freed_bytes(0),
--- 1171,1190 ----
G1CMIsAliveClosure is_alive(g1h);
_gc_tracer_cm->report_object_count_after_gc(&is_alive);
}
! 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),
*** 1219,1249 ****
hr->rem_set()->do_cleanup_work(_hrrs_cleanup_task);
}
return false;
}
! };
!
! class G1ParNoteEndTask: public AbstractGangTask {
! friend class G1NoteEndOfConcMarkClosure;
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) {
}
void work(uint worker_id) {
FreeRegionList local_cleanup_list("Local Cleanup List");
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);
assert(g1_note_end.complete(), "Shouldn't have yielded!");
// Now update the lists
_g1h->remove_from_old_sets(g1_note_end.old_regions_removed(), g1_note_end.humongous_regions_removed());
{
--- 1218,1244 ----
hr->rem_set()->do_cleanup_work(_hrrs_cleanup_task);
}
return false;
}
! };
protected:
G1CollectedHeap* _g1h;
FreeRegionList* _cleanup_list;
public:
G1ParNoteEndTask(G1CollectedHeap* g1h, FreeRegionList* cleanup_list, uint n_workers) :
! G1ParallelizeByRegionsTask("G1 note end", n_workers), _g1h(g1h), _cleanup_list(cleanup_list) {
}
void work(uint worker_id) {
FreeRegionList local_cleanup_list("Local Cleanup List");
HRRSCleanupTask hrrs_cleanup_task;
G1NoteEndOfConcMarkClosure g1_note_end(_g1h, &local_cleanup_list,
&hrrs_cleanup_task);
! all_heap_regions_work(&g1_note_end, worker_id );
assert(g1_note_end.complete(), "Shouldn't have yielded!");
// Now update the lists
_g1h->remove_from_old_sets(g1_note_end.old_regions_removed(), g1_note_end.humongous_regions_removed());
{