33
33
#include " gc/shenandoah/shenandoahOopClosures.inline.hpp"
34
34
#include " gc/shenandoah/shenandoahReferenceProcessor.hpp"
35
35
#include " gc/shenandoah/shenandoahRootProcessor.inline.hpp"
36
+ #include " gc/shenandoah/shenandoahStringDedup.hpp"
36
37
#include " gc/shenandoah/shenandoahSTWMark.hpp"
37
38
#include " gc/shenandoah/shenandoahVerifier.hpp"
38
39
40
+ template <StringDedupMode STRING_DEDUP>
41
+ class ShenandoahInitMarkRootsClosure : public OopClosure {
42
+ private:
43
+ ShenandoahObjToScanQueue* const _queue;
44
+ ShenandoahMarkingContext* const _mark_context;
45
+
46
+ template <class T >
47
+ inline void do_oop_work (T* p);
48
+
49
+ public:
50
+ ShenandoahInitMarkRootsClosure (ShenandoahObjToScanQueue* q);
51
+
52
+ void do_oop (narrowOop* p) { do_oop_work (p); }
53
+ void do_oop (oop* p) { do_oop_work (p); }
54
+ };
55
+
56
+ template <StringDedupMode STRING_DEDUP>
57
+ ShenandoahInitMarkRootsClosure<STRING_DEDUP>::ShenandoahInitMarkRootsClosure(ShenandoahObjToScanQueue* q) :
58
+ _queue (q),
59
+ _mark_context(ShenandoahHeap::heap()->marking_context()) {
60
+ }
61
+
62
+ template <StringDedupMode STRING_DEDUP>
63
+ template <class T >
64
+ void ShenandoahInitMarkRootsClosure<STRING_DEDUP>::do_oop_work(T* p) {
65
+ ShenandoahMark::mark_through_ref<T, STRING_DEDUP>(p, _queue, _mark_context, false );
66
+ }
67
+
39
68
class ShenandoahSTWMarkTask : public AbstractGangTask {
40
69
private:
41
70
ShenandoahSTWMark* const _mark;
@@ -99,8 +128,13 @@ void ShenandoahSTWMark::mark() {
99
128
}
100
129
101
130
void ShenandoahSTWMark::mark_roots (uint worker_id) {
102
- ShenandoahInitMarkRootsClosure init_mark (task_queues ()->queue (worker_id));
103
- _root_scanner.roots_do (&init_mark, worker_id);
131
+ if (ShenandoahStringDedup::is_enabled ()) {
132
+ ShenandoahInitMarkRootsClosure<ENQUEUE_DEDUP> init_mark (task_queues ()->queue (worker_id));
133
+ _root_scanner.roots_do (&init_mark, worker_id);
134
+ } else {
135
+ ShenandoahInitMarkRootsClosure<NO_DEDUP> init_mark (task_queues ()->queue (worker_id));
136
+ _root_scanner.roots_do (&init_mark, worker_id);
137
+ }
104
138
}
105
139
106
140
void ShenandoahSTWMark::finish_mark (uint worker_id) {
@@ -112,4 +146,3 @@ void ShenandoahSTWMark::finish_mark(uint worker_id) {
112
146
false , // not cancellable
113
147
ShenandoahStringDedup::is_enabled ());
114
148
}
115
-
0 commit comments