37 ShenandoahReentrantLock* ShenandoahNMethod::lock() {
38 return &_lock;
39 }
40
41 int ShenandoahNMethod::oop_count() const {
42 return _oops_count + static_cast<int>(nm()->oops_end() - nm()->oops_begin());
43 }
44
45 bool ShenandoahNMethod::has_oops() const {
46 return oop_count() > 0;
47 }
48
49 void ShenandoahNMethod::mark_unregistered() {
50 _unregistered = true;
51 }
52
53 bool ShenandoahNMethod::is_unregistered() const {
54 return _unregistered;
55 }
56
57 void ShenandoahNMethod::disarm_nmethod(nmethod* nm) {
58 if (!ShenandoahConcurrentRoots::can_do_concurrent_class_unloading()) {
59 return;
60 }
61
62 BarrierSetNMethod* const bs = BarrierSet::barrier_set()->barrier_set_nmethod();
63 assert(bs != NULL, "Sanity");
64 if (bs->is_armed(nm)) {
65 bs->disarm(nm);
66 }
67 }
68
69 ShenandoahNMethod* ShenandoahNMethod::gc_data(nmethod* nm) {
70 return nm->gc_data<ShenandoahNMethod>();
71 }
72
73 void ShenandoahNMethod::attach_gc_data(nmethod* nm, ShenandoahNMethod* gc_data) {
74 nm->set_gc_data<ShenandoahNMethod>(gc_data);
75 }
76
|
37 ShenandoahReentrantLock* ShenandoahNMethod::lock() {
38 return &_lock;
39 }
40
41 int ShenandoahNMethod::oop_count() const {
42 return _oops_count + static_cast<int>(nm()->oops_end() - nm()->oops_begin());
43 }
44
45 bool ShenandoahNMethod::has_oops() const {
46 return oop_count() > 0;
47 }
48
49 void ShenandoahNMethod::mark_unregistered() {
50 _unregistered = true;
51 }
52
53 bool ShenandoahNMethod::is_unregistered() const {
54 return _unregistered;
55 }
56
57 void ShenandoahNMethod::oops_do(OopClosure* oops, bool fix_relocations) {
58 for (int c = 0; c < _oops_count; c ++) {
59 oops->do_oop(_oops[c]);
60 }
61
62 oop* const begin = _nm->oops_begin();
63 oop* const end = _nm->oops_end();
64 for (oop* p = begin; p < end; p++) {
65 if (*p != Universe::non_oop_word()) {
66 oops->do_oop(p);
67 }
68 }
69
70 if (fix_relocations && _has_non_immed_oops) {
71 _nm->fix_oop_relocations();
72 }
73 }
74
75 void ShenandoahNMethod::heal_nmethod_metadata(ShenandoahNMethod* nmethod_data) {
76 ShenandoahEvacuateUpdateRootsClosure<> cl;
77 nmethod_data->oops_do(&cl, true /*fix relocation*/);
78 }
79
80 void ShenandoahNMethod::disarm_nmethod(nmethod* nm) {
81 if (!ShenandoahConcurrentRoots::can_do_concurrent_class_unloading()) {
82 return;
83 }
84
85 BarrierSetNMethod* const bs = BarrierSet::barrier_set()->barrier_set_nmethod();
86 assert(bs != NULL, "Sanity");
87 if (bs->is_armed(nm)) {
88 bs->disarm(nm);
89 }
90 }
91
92 ShenandoahNMethod* ShenandoahNMethod::gc_data(nmethod* nm) {
93 return nm->gc_data<ShenandoahNMethod>();
94 }
95
96 void ShenandoahNMethod::attach_gc_data(nmethod* nm, ShenandoahNMethod* gc_data) {
97 nm->set_gc_data<ShenandoahNMethod>(gc_data);
98 }
99
|