Skip to content

Commit 1d9ea3a

Browse files
committed
8266083: Shenandoah: Consolidate dedup/no dedup oop closures
Reviewed-by: rkennke
1 parent 80941f4 commit 1d9ea3a

File tree

3 files changed

+37
-77
lines changed

3 files changed

+37
-77
lines changed

src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ class ShenandoahFinalMarkingTask : public AbstractGangTask {
144144
while (satb_mq_set.apply_closure_to_completed_buffer(&cl)) {}
145145
assert(!heap->has_forwarded_objects(), "Not expected");
146146

147-
ShenandoahMarkRefsClosure mark_cl(q, rp);
147+
ShenandoahMarkRefsClosure<NO_DEDUP> mark_cl(q, rp);
148148
ShenandoahSATBAndRemarkThreadsClosure tc(satb_mq_set,
149149
ShenandoahIUBarrier ? &mark_cl : NULL);
150150
Threads::threads_do(&tc);
@@ -191,7 +191,9 @@ ShenandoahMarkConcurrentRootsTask::ShenandoahMarkConcurrentRootsTask(ShenandoahO
191191
void ShenandoahMarkConcurrentRootsTask::work(uint worker_id) {
192192
ShenandoahConcurrentWorkerSession worker_session(worker_id);
193193
ShenandoahObjToScanQueue* q = _queue_set->queue(worker_id);
194-
ShenandoahMarkRefsClosure cl(q, _rp);
194+
// Cannot enable string deduplication during root scanning. Otherwise,
195+
// may result lock inversion between stack watermark and string dedup queue lock.
196+
ShenandoahMarkRefsClosure<NO_DEDUP> cl(q, _rp);
195197
_root_scanner.roots_do(&cl, worker_id);
196198
}
197199

src/hotspot/share/gc/shenandoah/shenandoahMark.cpp

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -67,37 +67,45 @@ void ShenandoahMark::mark_loop_prework(uint w, TaskTerminator *t, ShenandoahRefe
6767
if (heap->unload_classes()) {
6868
if (heap->has_forwarded_objects()) {
6969
if (strdedup) {
70-
ShenandoahMarkUpdateRefsMetadataDedupClosure cl(q, rp);
71-
mark_loop_work<ShenandoahMarkUpdateRefsMetadataDedupClosure, CANCELLABLE>(&cl, ld, w, t);
70+
using Closure = ShenandoahMarkUpdateRefsMetadataClosure<ENQUEUE_DEDUP>;
71+
Closure cl(q, rp);
72+
mark_loop_work<Closure, CANCELLABLE>(&cl, ld, w, t);
7273
} else {
73-
ShenandoahMarkUpdateRefsMetadataClosure cl(q, rp);
74-
mark_loop_work<ShenandoahMarkUpdateRefsMetadataClosure, CANCELLABLE>(&cl, ld, w, t);
74+
using Closure = ShenandoahMarkUpdateRefsMetadataClosure<NO_DEDUP>;
75+
Closure cl(q, rp);
76+
mark_loop_work<Closure, CANCELLABLE>(&cl, ld, w, t);
7577
}
7678
} else {
7779
if (strdedup) {
78-
ShenandoahMarkRefsMetadataDedupClosure cl(q, rp);
79-
mark_loop_work<ShenandoahMarkRefsMetadataDedupClosure, CANCELLABLE>(&cl, ld, w, t);
80+
using Closure = ShenandoahMarkRefsMetadataClosure<ENQUEUE_DEDUP>;
81+
Closure cl(q, rp);
82+
mark_loop_work<Closure, CANCELLABLE>(&cl, ld, w, t);
8083
} else {
81-
ShenandoahMarkRefsMetadataClosure cl(q, rp);
82-
mark_loop_work<ShenandoahMarkRefsMetadataClosure, CANCELLABLE>(&cl, ld, w, t);
84+
using Closure = ShenandoahMarkRefsMetadataClosure<NO_DEDUP>;
85+
Closure cl(q, rp);
86+
mark_loop_work<Closure, CANCELLABLE>(&cl, ld, w, t);
8387
}
8488
}
8589
} else {
8690
if (heap->has_forwarded_objects()) {
8791
if (strdedup) {
88-
ShenandoahMarkUpdateRefsDedupClosure cl(q, rp);
89-
mark_loop_work<ShenandoahMarkUpdateRefsDedupClosure, CANCELLABLE>(&cl, ld, w, t);
92+
using Closure = ShenandoahMarkUpdateRefsClosure<ENQUEUE_DEDUP>;
93+
Closure cl(q, rp);
94+
mark_loop_work<Closure, CANCELLABLE>(&cl, ld, w, t);
9095
} else {
91-
ShenandoahMarkUpdateRefsClosure cl(q, rp);
92-
mark_loop_work<ShenandoahMarkUpdateRefsClosure, CANCELLABLE>(&cl, ld, w, t);
96+
using Closure = ShenandoahMarkUpdateRefsClosure<NO_DEDUP>;
97+
Closure cl(q, rp);
98+
mark_loop_work<Closure, CANCELLABLE>(&cl, ld, w, t);
9399
}
94100
} else {
95101
if (strdedup) {
96-
ShenandoahMarkRefsDedupClosure cl(q, rp);
97-
mark_loop_work<ShenandoahMarkRefsDedupClosure, CANCELLABLE>(&cl, ld, w, t);
102+
using Closure = ShenandoahMarkRefsClosure<ENQUEUE_DEDUP>;
103+
Closure cl(q, rp);
104+
mark_loop_work<Closure, CANCELLABLE>(&cl, ld, w, t);
98105
} else {
99-
ShenandoahMarkRefsClosure cl(q, rp);
100-
mark_loop_work<ShenandoahMarkRefsClosure, CANCELLABLE>(&cl, ld, w, t);
106+
using Closure = ShenandoahMarkRefsClosure<NO_DEDUP>;
107+
Closure cl(q, rp);
108+
mark_loop_work<Closure, CANCELLABLE>(&cl, ld, w, t);
101109
}
102110
}
103111
}

src/hotspot/share/gc/shenandoah/shenandoahOopClosures.hpp

Lines changed: 9 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2015, 2019, Red Hat, Inc. All rights reserved.
2+
* Copyright (c) 2015, 2021, Red Hat, Inc. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -75,10 +75,11 @@ class ShenandoahMarkUpdateRefsSuperClosure : public ShenandoahMarkRefsSuperClosu
7575
};
7676
};
7777

78+
template <StringDedupMode STRING_DEDUP>
7879
class ShenandoahMarkUpdateRefsClosure : public ShenandoahMarkUpdateRefsSuperClosure {
7980
private:
8081
template <class T>
81-
inline void do_oop_work(T* p) { work<T, NO_DEDUP>(p); }
82+
inline void do_oop_work(T* p) { work<T, STRING_DEDUP>(p); }
8283

8384
public:
8485
ShenandoahMarkUpdateRefsClosure(ShenandoahObjToScanQueue* q, ShenandoahReferenceProcessor* rp) :
@@ -89,24 +90,11 @@ class ShenandoahMarkUpdateRefsClosure : public ShenandoahMarkUpdateRefsSuperClos
8990
virtual bool do_metadata() { return false; }
9091
};
9192

92-
class ShenandoahMarkUpdateRefsDedupClosure : public ShenandoahMarkUpdateRefsSuperClosure {
93-
private:
94-
template <class T>
95-
inline void do_oop_work(T* p) { work<T, ENQUEUE_DEDUP>(p); }
96-
97-
public:
98-
ShenandoahMarkUpdateRefsDedupClosure(ShenandoahObjToScanQueue* q, ShenandoahReferenceProcessor* rp) :
99-
ShenandoahMarkUpdateRefsSuperClosure(q, rp) {}
100-
101-
virtual void do_oop(narrowOop* p) { do_oop_work(p); }
102-
virtual void do_oop(oop* p) { do_oop_work(p); }
103-
virtual bool do_metadata() { return false; }
104-
};
105-
93+
template <StringDedupMode STRING_DEDUP>
10694
class ShenandoahMarkUpdateRefsMetadataClosure : public ShenandoahMarkUpdateRefsSuperClosure {
10795
private:
10896
template <class T>
109-
inline void do_oop_work(T* p) { work<T, NO_DEDUP>(p); }
97+
inline void do_oop_work(T* p) { work<T, STRING_DEDUP>(p); }
11098

11199
public:
112100
ShenandoahMarkUpdateRefsMetadataClosure(ShenandoahObjToScanQueue* q, ShenandoahReferenceProcessor* rp) :
@@ -117,24 +105,12 @@ class ShenandoahMarkUpdateRefsMetadataClosure : public ShenandoahMarkUpdateRefsS
117105
virtual bool do_metadata() { return true; }
118106
};
119107

120-
class ShenandoahMarkUpdateRefsMetadataDedupClosure : public ShenandoahMarkUpdateRefsSuperClosure {
121-
private:
122-
template <class T>
123-
inline void do_oop_work(T* p) { work<T, ENQUEUE_DEDUP>(p); }
124-
125-
public:
126-
ShenandoahMarkUpdateRefsMetadataDedupClosure(ShenandoahObjToScanQueue* q, ShenandoahReferenceProcessor* rp) :
127-
ShenandoahMarkUpdateRefsSuperClosure(q, rp) {}
128-
129-
virtual void do_oop(narrowOop* p) { do_oop_work(p); }
130-
virtual void do_oop(oop* p) { do_oop_work(p); }
131-
virtual bool do_metadata() { return true; }
132-
};
133108

109+
template <StringDedupMode STRING_DEDUP>
134110
class ShenandoahMarkRefsClosure : public ShenandoahMarkRefsSuperClosure {
135111
private:
136112
template <class T>
137-
inline void do_oop_work(T* p) { work<T, NO_DEDUP>(p); }
113+
inline void do_oop_work(T* p) { work<T, STRING_DEDUP>(p); }
138114

139115
public:
140116
ShenandoahMarkRefsClosure(ShenandoahObjToScanQueue* q, ShenandoahReferenceProcessor* rp) :
@@ -145,24 +121,12 @@ class ShenandoahMarkRefsClosure : public ShenandoahMarkRefsSuperClosure {
145121
virtual bool do_metadata() { return false; }
146122
};
147123

148-
class ShenandoahMarkRefsDedupClosure : public ShenandoahMarkRefsSuperClosure {
149-
private:
150-
template <class T>
151-
inline void do_oop_work(T* p) { work<T, ENQUEUE_DEDUP>(p); }
152-
153-
public:
154-
ShenandoahMarkRefsDedupClosure(ShenandoahObjToScanQueue* q, ShenandoahReferenceProcessor* rp) :
155-
ShenandoahMarkRefsSuperClosure(q, rp) {};
156-
157-
virtual void do_oop(narrowOop* p) { do_oop_work(p); }
158-
virtual void do_oop(oop* p) { do_oop_work(p); }
159-
virtual bool do_metadata() { return false; }
160-
};
161124

125+
template <StringDedupMode STRING_DEDUP>
162126
class ShenandoahMarkRefsMetadataClosure : public ShenandoahMarkRefsSuperClosure {
163127
private:
164128
template <class T>
165-
inline void do_oop_work(T* p) { work<T, NO_DEDUP>(p); }
129+
inline void do_oop_work(T* p) { work<T, STRING_DEDUP>(p); }
166130

167131
public:
168132
ShenandoahMarkRefsMetadataClosure(ShenandoahObjToScanQueue* q, ShenandoahReferenceProcessor* rp) :
@@ -173,20 +137,6 @@ class ShenandoahMarkRefsMetadataClosure : public ShenandoahMarkRefsSuperClosure
173137
virtual bool do_metadata() { return true; }
174138
};
175139

176-
class ShenandoahMarkRefsMetadataDedupClosure : public ShenandoahMarkRefsSuperClosure {
177-
private:
178-
template <class T>
179-
inline void do_oop_work(T* p) { work<T, ENQUEUE_DEDUP>(p); }
180-
181-
public:
182-
ShenandoahMarkRefsMetadataDedupClosure(ShenandoahObjToScanQueue* q, ShenandoahReferenceProcessor* rp) :
183-
ShenandoahMarkRefsSuperClosure(q, rp) {};
184-
185-
virtual void do_oop(narrowOop* p) { do_oop_work(p); }
186-
virtual void do_oop(oop* p) { do_oop_work(p); }
187-
virtual bool do_metadata() { return true; }
188-
};
189-
190140
class ShenandoahUpdateRefsSuperClosure : public BasicOopIterateClosure {
191141
protected:
192142
ShenandoahHeap* _heap;

0 commit comments

Comments
 (0)