< prev index next >
src/hotspot/share/gc/shenandoah/shenandoahCodeRoots.cpp
Print this page
rev 54386 : 8221766: Load-reference barriers for Shenandoah
*** 117,159 ****
bool has_oops() {
return !_oops.is_empty();
}
};
- class ShenandoahNMethodOopInitializer : public OopClosure {
- private:
- ShenandoahHeap* const _heap;
-
- public:
- ShenandoahNMethodOopInitializer() : _heap(ShenandoahHeap::heap()) {};
-
- private:
- template <class T>
- inline void do_oop_work(T* p) {
- T o = RawAccess<>::oop_load(p);
- if (! CompressedOops::is_null(o)) {
- oop obj1 = CompressedOops::decode_not_null(o);
- oop obj2 = ShenandoahBarrierSet::barrier_set()->write_barrier(obj1);
- if (! oopDesc::equals_raw(obj1, obj2)) {
- shenandoah_assert_not_in_cset(NULL, obj2);
- RawAccess<IS_NOT_NULL>::oop_store(p, obj2);
- if (_heap->is_concurrent_traversal_in_progress()) {
- ShenandoahBarrierSet::barrier_set()->enqueue(obj2);
- }
- }
- }
- }
-
- public:
- void do_oop(oop* o) {
- do_oop_work(o);
- }
- void do_oop(narrowOop* o) {
- do_oop_work(o);
- }
- };
-
ShenandoahCodeRoots::PaddedLock ShenandoahCodeRoots::_recorded_nms_lock;
GrowableArray<ShenandoahNMethod*>* ShenandoahCodeRoots::_recorded_nms;
void ShenandoahCodeRoots::initialize() {
_recorded_nms_lock._lock = 0;
--- 117,126 ----
*** 161,185 ****
}
void ShenandoahCodeRoots::add_nmethod(nmethod* nm) {
switch (ShenandoahCodeRootsStyle) {
case 0:
! case 1: {
! ShenandoahNMethodOopInitializer init;
! nm->oops_do(&init);
! nm->fix_oop_relocations();
break;
- }
case 2: {
ShenandoahNMethodOopDetector detector;
nm->oops_do(&detector);
if (detector.has_oops()) {
- ShenandoahNMethodOopInitializer init;
- nm->oops_do(&init);
- nm->fix_oop_relocations();
-
ShenandoahNMethod* nmr = new ShenandoahNMethod(nm, detector.oops());
nmr->assert_alive_and_correct();
ShenandoahCodeRootsLock lock(true);
--- 128,144 ----
}
void ShenandoahCodeRoots::add_nmethod(nmethod* nm) {
switch (ShenandoahCodeRootsStyle) {
case 0:
! case 1:
break;
case 2: {
ShenandoahNMethodOopDetector detector;
nm->oops_do(&detector);
if (detector.has_oops()) {
ShenandoahNMethod* nmr = new ShenandoahNMethod(nm, detector.oops());
nmr->assert_alive_and_correct();
ShenandoahCodeRootsLock lock(true);
< prev index next >