Skip to content

Commit 79bdd81

Browse files
committed
8336763: Parallel: Merge PCMarkAndPushClosure and PCIterateMarkAndPushClosure
Reviewed-by: gli, zgu
1 parent 8162832 commit 79bdd81

File tree

4 files changed

+44
-45
lines changed

4 files changed

+44
-45
lines changed

src/hotspot/share/gc/parallel/psCompactionManager.cpp

+8-7
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,9 @@ Monitor* ParCompactionManager::_shadow_region_monitor = nullptr;
5454

5555
PreservedMarksSet* ParCompactionManager::_preserved_marks_set = nullptr;
5656

57-
ParCompactionManager::ParCompactionManager(PreservedMarks* preserved_marks) {
57+
ParCompactionManager::ParCompactionManager(PreservedMarks* preserved_marks,
58+
ReferenceProcessor* ref_processor)
59+
: _mark_and_push_closure(this, ref_processor) {
5860

5961
ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
6062

@@ -66,8 +68,9 @@ ParCompactionManager::ParCompactionManager(PreservedMarks* preserved_marks) {
6668
}
6769

6870
void ParCompactionManager::initialize(ParMarkBitMap* mbm) {
69-
assert(ParallelScavengeHeap::heap() != nullptr,
70-
"Needed for initialization");
71+
assert(ParallelScavengeHeap::heap() != nullptr, "Needed for initialization");
72+
assert(PSParallelCompact::ref_processor() != nullptr, "precondition");
73+
assert(ParallelScavengeHeap::heap()->workers().max_workers() != 0, "Not initialized?");
7174

7275
_mark_bitmap = mbm;
7376

@@ -85,15 +88,13 @@ void ParCompactionManager::initialize(ParMarkBitMap* mbm) {
8588

8689
// Create and register the ParCompactionManager(s) for the worker threads.
8790
for(uint i=0; i<parallel_gc_threads; i++) {
88-
_manager_array[i] = new ParCompactionManager(_preserved_marks_set->get(i));
91+
_manager_array[i] = new ParCompactionManager(_preserved_marks_set->get(i),
92+
PSParallelCompact::ref_processor());
8993
oop_task_queues()->register_queue(i, _manager_array[i]->oop_stack());
9094
_objarray_task_queues->register_queue(i, &_manager_array[i]->_objarray_stack);
9195
region_task_queues()->register_queue(i, _manager_array[i]->region_stack());
9296
}
9397

94-
assert(ParallelScavengeHeap::heap()->workers().max_workers() != 0,
95-
"Not initialized?");
96-
9798
_shadow_region_array = new (mtGC) GrowableArray<size_t >(10, mtGC);
9899

99100
_shadow_region_monitor = new Monitor(Mutex::nosafepoint, "CompactionManager_lock");

src/hotspot/share/gc/parallel/psCompactionManager.hpp

+19-1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#ifndef SHARE_GC_PARALLEL_PSCOMPACTIONMANAGER_HPP
2626
#define SHARE_GC_PARALLEL_PSCOMPACTIONMANAGER_HPP
2727

28+
#include "classfile/classLoaderData.hpp"
2829
#include "gc/parallel/psParallelCompact.hpp"
2930
#include "gc/shared/preservedMarks.hpp"
3031
#include "gc/shared/stringdedup/stringDedup.hpp"
@@ -40,13 +41,27 @@ class ObjectStartArray;
4041
class ParallelCompactData;
4142
class ParMarkBitMap;
4243

44+
class PCMarkAndPushClosure: public ClaimMetadataVisitingOopIterateClosure {
45+
ParCompactionManager* _compaction_manager;
46+
47+
template <typename T> void do_oop_work(T* p);
48+
public:
49+
PCMarkAndPushClosure(ParCompactionManager* cm, ReferenceProcessor* rp) :
50+
ClaimMetadataVisitingOopIterateClosure(ClassLoaderData::_claim_stw_fullgc_mark, rp),
51+
_compaction_manager(cm) { }
52+
53+
virtual void do_oop(oop* p) { do_oop_work(p); }
54+
virtual void do_oop(narrowOop* p) { do_oop_work(p); }
55+
};
56+
4357
class ParCompactionManager : public CHeapObj<mtGC> {
4458
friend class MarkFromRootsTask;
4559
friend class ParallelCompactRefProcProxyTask;
4660
friend class ParallelScavengeRefProcProxyTask;
4761
friend class ParMarkBitMap;
4862
friend class PSParallelCompact;
4963
friend class FillDensePrefixAndCompactionTask;
64+
friend class PCAddThreadRootsMarkingTaskClosure;
5065

5166
private:
5267
typedef OverflowTaskQueue<oop, mtGC> OopTaskQueue;
@@ -71,6 +86,7 @@ class ParCompactionManager : public CHeapObj<mtGC> {
7186
ObjArrayTaskQueue _objarray_stack;
7287
size_t _next_shadow_region;
7388

89+
PCMarkAndPushClosure _mark_and_push_closure;
7490
// Is there a way to reuse the _oop_stack for the
7591
// saving empty regions? For now just create a different
7692
// type of TaskQueue.
@@ -104,7 +120,9 @@ class ParCompactionManager : public CHeapObj<mtGC> {
104120
// objArray stack, otherwise returns false and the task is invalid.
105121
bool publish_or_pop_objarray_tasks(ObjArrayTask& task);
106122

107-
ParCompactionManager(PreservedMarks* preserved_marks);
123+
ParCompactionManager(PreservedMarks* preserved_marks,
124+
ReferenceProcessor* ref_processor);
125+
108126
// Array of task queues. Needed by the task terminator.
109127
static RegionTaskQueueSet* region_task_queues() { return _region_task_queues; }
110128
OopTaskQueue* oop_stack() { return &_oop_stack; }

src/hotspot/share/gc/parallel/psCompactionManager.inline.hpp

+6-26
Original file line numberDiff line numberDiff line change
@@ -41,29 +41,10 @@
4141
#include "utilities/debug.hpp"
4242
#include "utilities/globalDefinitions.hpp"
4343

44-
class PCMarkAndPushClosure: public OopClosure {
45-
private:
46-
ParCompactionManager* _compaction_manager;
47-
public:
48-
PCMarkAndPushClosure(ParCompactionManager* cm) : _compaction_manager(cm) { }
49-
50-
template <typename T> void do_oop_work(T* p) { _compaction_manager->mark_and_push(p); }
51-
virtual void do_oop(oop* p) { do_oop_work(p); }
52-
virtual void do_oop(narrowOop* p) { do_oop_work(p); }
53-
};
54-
55-
class PCIterateMarkAndPushClosure: public ClaimMetadataVisitingOopIterateClosure {
56-
private:
57-
ParCompactionManager* _compaction_manager;
58-
public:
59-
PCIterateMarkAndPushClosure(ParCompactionManager* cm, ReferenceProcessor* rp) :
60-
ClaimMetadataVisitingOopIterateClosure(ClassLoaderData::_claim_stw_fullgc_mark, rp),
61-
_compaction_manager(cm) { }
62-
63-
template <typename T> void do_oop_work(T* p) { _compaction_manager->mark_and_push(p); }
64-
virtual void do_oop(oop* p) { do_oop_work(p); }
65-
virtual void do_oop(narrowOop* p) { do_oop_work(p); }
66-
};
44+
template <typename T>
45+
inline void PCMarkAndPushClosure::do_oop_work(T* p) {
46+
_compaction_manager->mark_and_push(p);
47+
}
6748

6849
inline bool ParCompactionManager::steal(int queue_num, oop& t) {
6950
return oop_task_queues()->steal(queue_num, t);
@@ -161,13 +142,12 @@ inline void ParCompactionManager::follow_array(objArrayOop obj, int index) {
161142

162143
inline void ParCompactionManager::follow_contents(oop obj) {
163144
assert(PSParallelCompact::mark_bitmap()->is_marked(obj), "should be marked");
164-
PCIterateMarkAndPushClosure cl(this, PSParallelCompact::ref_processor());
165145

166146
if (obj->is_objArray()) {
167-
cl.do_klass(obj->klass());
147+
_mark_and_push_closure.do_klass(obj->klass());
168148
follow_array(objArrayOop(obj), 0);
169149
} else {
170-
obj->oop_iterate(&cl);
150+
obj->oop_iterate(&_mark_and_push_closure);
171151
}
172152
}
173153

src/hotspot/share/gc/parallel/psParallelCompact.cpp

+11-11
Original file line numberDiff line numberDiff line change
@@ -1188,10 +1188,11 @@ class PCAddThreadRootsMarkingTaskClosure : public ThreadClosure {
11881188

11891189
ParCompactionManager* cm = ParCompactionManager::gc_thread_compaction_manager(_worker_id);
11901190

1191-
PCMarkAndPushClosure mark_and_push_closure(cm);
1192-
MarkingNMethodClosure mark_and_push_in_blobs(&mark_and_push_closure, !NMethodToOopClosure::FixRelocations, true /* keepalive nmethods */);
1191+
MarkingNMethodClosure mark_and_push_in_blobs(&cm->_mark_and_push_closure,
1192+
!NMethodToOopClosure::FixRelocations,
1193+
true /* keepalive nmethods */);
11931194

1194-
thread->oops_do(&mark_and_push_closure, &mark_and_push_in_blobs);
1195+
thread->oops_do(&cm->_mark_and_push_closure, &mark_and_push_in_blobs);
11951196

11961197
// Do the real work
11971198
cm->follow_marking_stacks();
@@ -1232,22 +1233,22 @@ class MarkFromRootsTask : public WorkerTask {
12321233
virtual void work(uint worker_id) {
12331234
ParCompactionManager* cm = ParCompactionManager::gc_thread_compaction_manager(worker_id);
12341235
cm->create_marking_stats_cache();
1235-
PCMarkAndPushClosure mark_and_push_closure(cm);
1236-
12371236
{
1238-
CLDToOopClosure cld_closure(&mark_and_push_closure, ClassLoaderData::_claim_stw_fullgc_mark);
1237+
CLDToOopClosure cld_closure(&cm->_mark_and_push_closure, ClassLoaderData::_claim_stw_fullgc_mark);
12391238
ClassLoaderDataGraph::always_strong_cld_do(&cld_closure);
12401239

12411240
// Do the real work
12421241
cm->follow_marking_stacks();
12431242
}
12441243

1245-
PCAddThreadRootsMarkingTaskClosure closure(worker_id);
1246-
Threads::possibly_parallel_threads_do(true /* is_par */, &closure);
1244+
{
1245+
PCAddThreadRootsMarkingTaskClosure closure(worker_id);
1246+
Threads::possibly_parallel_threads_do(_active_workers > 1 /* is_par */, &closure);
1247+
}
12471248

12481249
// Mark from OopStorages
12491250
{
1250-
_oop_storage_set_par_state.oops_do(&mark_and_push_closure);
1251+
_oop_storage_set_par_state.oops_do(&cm->_mark_and_push_closure);
12511252
// Do the real work
12521253
cm->follow_marking_stacks();
12531254
}
@@ -1269,10 +1270,9 @@ class ParallelCompactRefProcProxyTask : public RefProcProxyTask {
12691270
void work(uint worker_id) override {
12701271
assert(worker_id < _max_workers, "sanity");
12711272
ParCompactionManager* cm = (_tm == RefProcThreadModel::Single) ? ParCompactionManager::get_vmthread_cm() : ParCompactionManager::gc_thread_compaction_manager(worker_id);
1272-
PCMarkAndPushClosure keep_alive(cm);
12731273
BarrierEnqueueDiscoveredFieldClosure enqueue;
12741274
ParCompactionManager::FollowStackClosure complete_gc(cm, (_tm == RefProcThreadModel::Single) ? nullptr : &_terminator, worker_id);
1275-
_rp_task->rp_work(worker_id, PSParallelCompact::is_alive_closure(), &keep_alive, &enqueue, &complete_gc);
1275+
_rp_task->rp_work(worker_id, PSParallelCompact::is_alive_closure(), &cm->_mark_and_push_closure, &enqueue, &complete_gc);
12761276
}
12771277

12781278
void prepare_run_task_hook() override {

0 commit comments

Comments
 (0)