src/share/vm/code/nmethod.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/src/share/vm/code/nmethod.cpp	Wed Nov  6 18:35:34 2013
--- new/src/share/vm/code/nmethod.cpp	Wed Nov  6 18:35:34 2013

*** 624,634 **** --- 624,634 ---- Disassembler::decode(nm); } } // verify nmethod ! debug_only(if (nm) nm->verify();) // might block ! debug_only(if (nm != NULL) nm->verify(/*allow_safepoints=*/ false);) if (nm != NULL) { nm->log_new_nmethod(); }
*** 2349,2359 **** --- 2349,2359 ---- (void *)(*p), (intptr_t)p, (int)((intptr_t)p - (intptr_t)_nm)); } virtual void do_oop(narrowOop* p) { ShouldNotReachHere(); } }; ! void nmethod::verify(bool allow_safepoints) { // Hmm. OSR methods can be deopted but not marked as zombie or not_entrant // seems odd. if( is_zombie() || is_not_entrant() )
*** 2388,2414 **** --- 2388,2417 ---- VerifyOopsClosure voc(this); oops_do(&voc); assert(voc.ok(), "embedded oops must be OK"); verify_scavenge_root_oops(); ! verify_scopes(allow_safepoints); } ! void nmethod::verify_interrupt_point(address call_site, bool allow_safepoints) { // This code does not work in release mode since // owns_lock only is available in debug mode. CompiledIC* ic = NULL; Thread *cur = Thread::current(); if (CompiledIC_lock->owner() == cur || ((cur->is_VM_thread() || cur->is_ConcurrentGC_thread()) && SafepointSynchronize::is_at_safepoint())) { ic = CompiledIC_at(this, call_site); CHECK_UNHANDLED_OOPS_ONLY(Thread::current()->clear_unhandled_oops()); ! } else if (allow_safepoints) { MutexLocker ml_verify (CompiledIC_lock); ic = CompiledIC_at(this, call_site); + } else { + // CompiledIC verification requires CompiledIC_lock, but there's no way + // to grab it when safepoints are forbidden. Attempts to grab CompiledIC_lock + // w/o safepoint checks lead to deadlocks. + return; } PcDesc* pd = pc_desc_at(ic->end_of_call()); assert(pd != NULL, "PcDesc must exist"); for (ScopeDesc* sd = new ScopeDesc(this, pd->scope_decode_offset(), pd->obj_decode_offset(), pd->should_reexecute(),
*** 2416,2440 **** --- 2419,2443 ---- !sd->is_top(); sd = sd->sender()) { sd->verify(); } } ! void nmethod::verify_scopes(bool allow_safepoints) { if( !method() ) return; // Runtime stubs have no scope if (method()->is_native()) return; // Ignore stub methods. // iterate through all interrupt point // and verify the debug information is valid. RelocIterator iter((nmethod*)this); while (iter.next()) { address stub = NULL; switch (iter.type()) { case relocInfo::virtual_call_type: ! verify_interrupt_point(iter.addr(), allow_safepoints); break; case relocInfo::opt_virtual_call_type: stub = iter.opt_virtual_call_reloc()->static_stub(); ! verify_interrupt_point(iter.addr(), allow_safepoints); break; case relocInfo::static_call_type: stub = iter.static_call_reloc()->static_stub(); //verify_interrupt_point(iter.addr()); break;

src/share/vm/code/nmethod.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File