34 bool ZBarrierSetNMethod::nmethod_entry_barrier(nmethod* nm) {
35 ZLocker<ZReentrantLock> locker(ZNMethod::lock_for_nmethod(nm));
36 log_trace(nmethod, barrier)("Entered critical zone for %p", nm);
37
38 if (!is_armed(nm)) {
39 // Some other thread got here first and healed the oops
40 // and disarmed the nmethod.
41 return true;
42 }
43
44 MACOS_AARCH64_ONLY(ThreadWXEnable wx(WXWrite, Thread::current()));
45
46 if (nm->is_unloading()) {
47 // We don't need to take the lock when unlinking nmethods from
48 // the Method, because it is only concurrently unlinked by
49 // the entry barrier, which acquires the per nmethod lock.
50 nm->unlink_from_method();
51
52 // We can end up calling nmethods that are unloading
53 // since we clear compiled ICs lazily. Returning false
54 // will re-resovle the call and update the compiled IC.
55 return false;
56 }
57
58 // Heal oops
59 ZNMethod::nmethod_oops_barrier(nm);
60
61
62 // CodeCache unloading support
63 nm->mark_as_maybe_on_stack();
64
65 // Disarm
66 disarm(nm);
67
68 return true;
69 }
70
71 int* ZBarrierSetNMethod::disarmed_guard_value_address() const {
72 return (int*)ZAddressBadMaskHighOrderBitsAddr;
73 }
74
|
34 bool ZBarrierSetNMethod::nmethod_entry_barrier(nmethod* nm) {
35 ZLocker<ZReentrantLock> locker(ZNMethod::lock_for_nmethod(nm));
36 log_trace(nmethod, barrier)("Entered critical zone for %p", nm);
37
38 if (!is_armed(nm)) {
39 // Some other thread got here first and healed the oops
40 // and disarmed the nmethod.
41 return true;
42 }
43
44 MACOS_AARCH64_ONLY(ThreadWXEnable wx(WXWrite, Thread::current()));
45
46 if (nm->is_unloading()) {
47 // We don't need to take the lock when unlinking nmethods from
48 // the Method, because it is only concurrently unlinked by
49 // the entry barrier, which acquires the per nmethod lock.
50 nm->unlink_from_method();
51
52 // We can end up calling nmethods that are unloading
53 // since we clear compiled ICs lazily. Returning false
54 // will re-resolve the call and update the compiled IC.
55 return false;
56 }
57
58 // Heal oops
59 ZNMethod::nmethod_oops_barrier(nm);
60
61
62 // CodeCache unloading support
63 nm->mark_as_maybe_on_stack();
64
65 // Disarm
66 disarm(nm);
67
68 return true;
69 }
70
71 int* ZBarrierSetNMethod::disarmed_guard_value_address() const {
72 return (int*)ZAddressBadMaskHighOrderBitsAddr;
73 }
74
|