@@ -109,53 +109,37 @@ void ShenandoahUpdateRefsClosure::do_oop_work(T* p) {
109109void ShenandoahUpdateRefsClosure::do_oop (oop* p) { do_oop_work (p); }
110110void ShenandoahUpdateRefsClosure::do_oop (narrowOop* p) { do_oop_work (p); }
111111
112- template <DecoratorSet MO>
113- ShenandoahEvacuateUpdateMetadataClosure<MO>::ShenandoahEvacuateUpdateMetadataClosure() :
114- _heap (ShenandoahHeap::heap()), _thread(Thread::current()) {
115- }
116-
117- template <DecoratorSet MO>
118- template <class T >
119- void ShenandoahEvacuateUpdateMetadataClosure<MO>::do_oop_work(T* p) {
120- assert (_heap->is_concurrent_weak_root_in_progress () ||
121- _heap->is_concurrent_strong_root_in_progress (),
122- " Only do this in root processing phase" );
123- assert (_thread == Thread::current (), " Wrong thread" );
124-
125- T o = RawAccess<>::oop_load (p);
126- if (! CompressedOops::is_null (o)) {
127- oop obj = CompressedOops::decode_not_null (o);
128- if (_heap->in_collection_set (obj)) {
129- assert (_heap->is_evacuation_in_progress (), " Only do this when evacuation is in progress" );
130- shenandoah_assert_marked (p, obj);
131- oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null (obj);
132- if (resolved == obj) {
133- resolved = _heap->evacuate_object (obj, _thread);
134- }
135- RawAccess<IS_NOT_NULL | MO>::oop_store (p, resolved);
136- }
112+ template <bool concurrent, bool stable_thread>
113+ ShenandoahEvacuateUpdateRootClosureBase<concurrent, stable_thread>::ShenandoahEvacuateUpdateRootClosureBase() :
114+ _heap (ShenandoahHeap::heap()), _thread(stable_thread ? Thread::current() : NULL) {
115+ }
116+
117+ template <bool concurrent, bool stable_thread>
118+ void ShenandoahEvacuateUpdateRootClosureBase<concurrent, stable_thread>::do_oop(oop* p) {
119+ if (concurrent) {
120+ ShenandoahEvacOOMScope scope;
121+ do_oop_work (p);
122+ } else {
123+ do_oop_work (p);
137124 }
138125}
139- template <DecoratorSet MO>
140- void ShenandoahEvacuateUpdateMetadataClosure<MO>::do_oop(oop* p) {
141- do_oop_work (p);
142- }
143-
144- template <DecoratorSet MO>
145- void ShenandoahEvacuateUpdateMetadataClosure<MO>::do_oop(narrowOop* p) {
146- do_oop_work (p);
147- }
148126
149- ShenandoahEvacuateUpdateRootsClosure::ShenandoahEvacuateUpdateRootsClosure () :
150- _heap(ShenandoahHeap::heap()) {
127+ template <bool concurrent, bool stable_thread>
128+ void ShenandoahEvacuateUpdateRootClosureBase<concurrent, stable_thread>::do_oop(narrowOop* p) {
129+ if (concurrent) {
130+ ShenandoahEvacOOMScope scope;
131+ do_oop_work (p);
132+ } else {
133+ do_oop_work (p);
134+ }
151135}
152136
153- template <typename T>
154- void ShenandoahEvacuateUpdateRootsClosure::do_oop_work (T* p, Thread* t) {
137+ template <bool atomic, bool stable_thread>
138+ template <class T >
139+ void ShenandoahEvacuateUpdateRootClosureBase<atomic, stable_thread>::do_oop_work(T* p) {
155140 assert (_heap->is_concurrent_weak_root_in_progress () ||
156141 _heap->is_concurrent_strong_root_in_progress (),
157142 " Only do this in root processing phase" );
158- assert (t == Thread::current (), " Wrong thread" );
159143
160144 T o = RawAccess<>::oop_load (p);
161145 if (!CompressedOops::is_null (o)) {
@@ -165,38 +149,20 @@ void ShenandoahEvacuateUpdateRootsClosure::do_oop_work(T* p, Thread* t) {
165149 shenandoah_assert_marked (p, obj);
166150 oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null (obj);
167151 if (resolved == obj) {
168- resolved = _heap->evacuate_object (obj, t);
152+ Thread* thr = stable_thread ? _thread : Thread::current ();
153+ assert (thr == Thread::current (), " Wrong thread" );
154+
155+ resolved = _heap->evacuate_object (obj, thr);
156+ }
157+ if (atomic) {
158+ ShenandoahHeap::atomic_update_oop (resolved, p, o);
159+ } else {
160+ RawAccess<IS_NOT_NULL | MO_UNORDERED>::oop_store (p, resolved);
169161 }
170- ShenandoahHeap::atomic_update_oop (resolved, p, o);
171162 }
172163 }
173164}
174165
175- void ShenandoahEvacuateUpdateRootsClosure::do_oop (oop* p) {
176- ShenandoahEvacOOMScope scope;
177- do_oop_work (p, Thread::current ());
178- }
179-
180- void ShenandoahEvacuateUpdateRootsClosure::do_oop (narrowOop* p) {
181- ShenandoahEvacOOMScope scope;
182- do_oop_work (p, Thread::current ());
183- }
184-
185- ShenandoahContextEvacuateUpdateRootsClosure::ShenandoahContextEvacuateUpdateRootsClosure () :
186- ShenandoahEvacuateUpdateRootsClosure(),
187- _thread(Thread::current()) {
188- }
189-
190- void ShenandoahContextEvacuateUpdateRootsClosure::do_oop (oop* p) {
191- ShenandoahEvacOOMScope scope;
192- do_oop_work (p, _thread);
193- }
194-
195- void ShenandoahContextEvacuateUpdateRootsClosure::do_oop (narrowOop* p) {
196- ShenandoahEvacOOMScope scope;
197- do_oop_work (p, _thread);
198- }
199-
200166template <bool CONCURRENT, typename IsAlive, typename KeepAlive>
201167ShenandoahCleanUpdateWeakOopsClosure<CONCURRENT, IsAlive, KeepAlive>::ShenandoahCleanUpdateWeakOopsClosure(IsAlive* is_alive, KeepAlive* keep_alive) :
202168 _is_alive (is_alive), _keep_alive(keep_alive) {
0 commit comments