public OopHandle getOopHandle(int x) { Address oopAddr = getOopHandleAddress(x); if (oopAddr != null) { return oopAddr.getOopHandleAt(0); } return null; }
public ThreadProxy getThreadProxy(Address addr) { // Addr is the address of the JavaThread. // Fetch the OSThread (for now and for simplicity, not making a // separate "OSThread" class in this package) Address osThreadAddr = osThreadField.getValue(addr); // Get the address of the _thread_id from the OSThread Address threadIdAddr = osThreadAddr.addOffsetTo(osThreadThreadIDField.getOffset()); JVMDebugger debugger = VM.getVM().getDebugger(); return debugger.getThreadForIdentifierAddress(threadIdAddr); }
/** * Debugging routine: returns the index (0..top() - 1) of the handle in this block, or -1 if the * handle was not contained in this block. Does not search successor blocks. */ public int indexOfHandle(Address jniHandle) { for (int i = 0; i < top(); i++) { Address addr = getOopHandleAddress(i); if (addr != null) { if (addr.equals(jniHandle)) { return i; } } } return -1; }
/** Only returns addresses of valid OopHandles */ private Address getOopHandleAddress(int x) { if (Assert.ASSERTS_ENABLED) { Assert.that(x < top(), "out of bounds"); } Address oopAddr = addr.addOffsetTo(handlesField.getOffset() + x * VM.getVM().getOopSize()); OopHandle handle = oopAddr.getOopHandleAt(0); if (VM.getVM().getUniverse().isInReserved(handle) && !VM.getVM().getJNIHandles().isDeletedHandle(handle)) { /* the oop handle is valid only if it is not freed (i.e. reserved in heap) and is not a deleted oop */ return oopAddr; } else { return null; } }
// refer to Threads::owning_thread_from_monitor_owner public JavaThread owningThreadFromMonitor(Address o) { if (o == null) return null; for (JavaThread thread = first(); thread != null; thread = thread.next()) { if (o.equals(thread.threadObjectAddress())) { return thread; } } for (JavaThread thread = first(); thread != null; thread = thread.next()) { if (thread.isLockOwned(o)) return thread; } return null; }
public Address getLastJavaFP(Address addr) { return lastJavaFPField.getValue( addr.addOffsetTo(sun.jvm.hotspot.runtime.JavaThread.getAnchorField().getOffset())); }
public int regEncode() { if (matcherRegEncodeAddr != null) { return (int) matcherRegEncodeAddr.getCIntegerAt(value, 1, true); } return value; }