< prev index next >

src/hotspot/share/gc/z/zBarrierSetNMethod.cpp

Print this page

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 
< prev index next >