src/share/vm/code/nmethod.hpp

Print this page

        

*** 192,202 **** jbyte _scavenge_root_state; NOT_PRODUCT(bool _has_debug_info; ) ! // Nmethod Flushing lock (if non-zero, then the nmethod is not removed) jint _lock_count; // not_entrant method removal. Each mark_sweep pass will update // this mark to current sweep invocation count if it is seen on the // stack. An not_entrant method can be removed when there is no --- 192,205 ---- jbyte _scavenge_root_state; NOT_PRODUCT(bool _has_debug_info; ) ! // Nmethod Flushing lock. If non-zero, then the nmethod is not removed ! // and is not made into a zombie. However, once the nmethod is made into ! // a zombie, it will be locked one final time if CompiledMethodUnload ! // event processing needs to be done. jint _lock_count; // not_entrant method removal. Each mark_sweep pass will update // this mark to current sweep invocation count if it is seen on the // stack. An not_entrant method can be removed when there is no
*** 520,531 **** protected: void flush(); public: ! // If returning true, it is unsafe to remove this nmethod even though it is a zombie ! // nmethod, since the VM might have a reference to it. Should only be called from a safepoint. bool is_locked_by_vm() const { return _lock_count >0; } // See comment at definition of _last_seen_on_stack void mark_as_seen_on_stack(); bool can_not_entrant_be_converted(); --- 523,535 ---- protected: void flush(); public: ! // When true is returned, it is unsafe to remove this nmethod even if ! // it is a zombie, since the VM or the ServiceThread might still be ! // using it. Should only be called from a safepoint. bool is_locked_by_vm() const { return _lock_count >0; } // See comment at definition of _last_seen_on_stack void mark_as_seen_on_stack(); bool can_not_entrant_be_converted();
*** 687,703 **** static int osr_entry_point_offset() { return offset_of(nmethod, _osr_entry_point); } static int entry_bci_offset() { return offset_of(nmethod, _entry_bci); } }; ! // Locks an nmethod so its code will not get removed, even if it is a zombie/not_entrant method class nmethodLocker : public StackObj { nmethod* _nm; public: ! static void lock_nmethod(nmethod* nm); // note: nm can be NULL static void unlock_nmethod(nmethod* nm); // (ditto) nmethodLocker(address pc); // derive nm from pc nmethodLocker(nmethod *nm) { _nm = nm; lock_nmethod(_nm); } nmethodLocker() { _nm = NULL; } --- 691,714 ---- static int osr_entry_point_offset() { return offset_of(nmethod, _osr_entry_point); } static int entry_bci_offset() { return offset_of(nmethod, _entry_bci); } }; ! // Locks an nmethod so its code will not get removed and it will not ! // be made into a zombie, even if it is a not_entrant method. After the ! // nmethod becomes a zombie, if CompiledMethodUnload event processing ! // needs to be done, then lock_nmethod() is used directly to keep the ! // generated code from being reused too early. class nmethodLocker : public StackObj { nmethod* _nm; public: ! // note: nm can be NULL ! // Only JvmtiDeferredEvent::compiled_method_unload_event() ! // should pass zombie_ok == true. ! static void lock_nmethod(nmethod* nm, bool zombie_ok = false); static void unlock_nmethod(nmethod* nm); // (ditto) nmethodLocker(address pc); // derive nm from pc nmethodLocker(nmethod *nm) { _nm = nm; lock_nmethod(_nm); } nmethodLocker() { _nm = NULL; }