Mercurial > hg > truffle
diff agent/src/share/classes/sun/jvm/hotspot/utilities/PointerLocation.java @ 0:a61af66fc99e jdk7-b24
Initial load
author | duke |
---|---|
date | Sat, 01 Dec 2007 00:00:00 +0000 |
parents | |
children | c18cbe5936b8 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/agent/src/share/classes/sun/jvm/hotspot/utilities/PointerLocation.java Sat Dec 01 00:00:00 2007 +0000 @@ -0,0 +1,280 @@ +/* + * Copyright 2000-2004 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ + +package sun.jvm.hotspot.utilities; + +import java.io.*; +import sun.jvm.hotspot.code.*; +import sun.jvm.hotspot.debugger.*; +import sun.jvm.hotspot.gc_interface.*; +import sun.jvm.hotspot.interpreter.*; +import sun.jvm.hotspot.runtime.*; +import sun.jvm.hotspot.memory.*; + +/** This class attempts to describe possible locations of pointers in + the VM. */ + +public class PointerLocation { + ////////////////////////////////////////////////////////////////// + // // + // These are package private to simplify the implementation and // + // interaction with PointerFinder // + // // + ////////////////////////////////////////////////////////////////// + + Address addr; + + CollectedHeap heap; + Generation gen; + Generation permGen; + + // If UseTLAB was enabled and the pointer was found in a + // currently-active TLAB, these will be set + boolean inTLAB; + JavaThread tlabThread; + ThreadLocalAllocBuffer tlab; + + // Generated code locations + boolean inInterpreter; + boolean inCodeCache; + + // FIXME: add other locations like VTableStubs, StubRoutines, maybe + // even "on thread x's stack" + + InterpreterCodelet interpreterCodelet; + CodeBlob blob; + // FIXME: add more detail about CodeBlob + boolean inBlobInstructions; + boolean inBlobData; + boolean inBlobOops; + boolean inBlobUnknownLocation; + + boolean inStrongGlobalJNIHandleBlock; + boolean inWeakGlobalJNIHandleBlock; + boolean inLocalJNIHandleBlock; + JNIHandleBlock handleBlock; + sun.jvm.hotspot.runtime.Thread handleThread; + + public PointerLocation(Address addr) { + this.addr = addr; + } + + public boolean isInHeap() { + return (heap != null || (gen != null) || (permGen != null)); + } + + public boolean isInNewGen() { + return ((gen != null) && (gen.level() == 0)); + } + + public boolean isInOldGen() { + return ((gen != null) && (gen.level() == 1)); + } + + public boolean isInPermGen() { + return (permGen != null); + } + + public boolean inOtherGen() { + return (!isInNewGen() && !isInOldGen() && !isInPermGen()); + } + + /** Only valid if isInHeap() */ + public Generation getGeneration() { + if (gen != null) { + return gen; + } else { + return permGen; + } + } + + /** This may be true if isInNewGen is also true */ + public boolean isInTLAB() { + return inTLAB; + } + + /** Only valid if isInTLAB() returns true */ + public JavaThread getTLABThread() { + return tlabThread; + } + + /** Only valid if isInTLAB() returns true */ + public ThreadLocalAllocBuffer getTLAB() { + return tlab; + } + + public boolean isInInterpreter() { + return inInterpreter; + } + + /** For now, only valid if isInInterpreter is true */ + public InterpreterCodelet getInterpreterCodelet() { + return interpreterCodelet; + } + + public boolean isInCodeCache() { + return inCodeCache; + } + + /** For now, only valid if isInCodeCache is true */ + public CodeBlob getCodeBlob() { + return blob; + } + + public boolean isInBlobInstructions() { + return inBlobInstructions; + } + + public boolean isInBlobData() { + return inBlobData; + } + + public boolean isInBlobOops() { + return inBlobOops; + } + + public boolean isInBlobUnknownLocation() { + return inBlobUnknownLocation; + } + + public boolean isInStrongGlobalJNIHandleBlock() { + return inStrongGlobalJNIHandleBlock; + } + + public boolean isInWeakGlobalJNIHandleBlock() { + return inWeakGlobalJNIHandleBlock; + } + + public boolean isInLocalJNIHandleBlock() { + return inLocalJNIHandleBlock; + } + + /** Only valid if isInStrongGlobalJNIHandleBlock, + isInWeakGlobalJNIHandleBlock, or isInLocalJNIHandleBlock is true */ + public JNIHandleBlock getJNIHandleBlock() { + return handleBlock; + } + + /** Only valid if isInLocalJNIHandleBlock is true */ + public sun.jvm.hotspot.runtime.Thread getJNIHandleThread() { + return handleThread; + } + + public boolean isUnknown() { + return (!(isInHeap() || isInInterpreter() || isInCodeCache() || + isInStrongGlobalJNIHandleBlock() || isInWeakGlobalJNIHandleBlock() || isInLocalJNIHandleBlock())); + } + + public String toString() { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + printOn(new PrintStream(bos)); + return bos.toString(); + } + + public void print() { + printOn(System.out); + } + + public void printOn(PrintStream tty) { + tty.print("Address "); + if (addr == null) { + tty.print("0x0"); + } else { + tty.print(addr.toString()); + } + tty.print(": "); + if (isInHeap()) { + if (isInTLAB()) { + tty.print("In thread-local allocation buffer for thread \"" + + getTLABThread().getThreadName() + "\" ("); + getTLABThread().printThreadIDOn(tty); + tty.print(") "); + getTLAB().printOn(tty); + } else { + if (isInNewGen()) { + tty.print("In new generation "); + } else if (isInOldGen()) { + tty.print("In old generation "); + } else if (isInPermGen()) { + tty.print("In perm generation "); + } else if (gen != null) { + tty.print("In Generation " + getGeneration().level()); + } else { + tty.print("In unknown section of Java heap"); + } + if (getGeneration() != null) { + getGeneration().printOn(tty); + } + } + } else if (isInInterpreter()) { + tty.println("In interpreter codelet \"" + interpreterCodelet.getDescription() + "\""); + interpreterCodelet.printOn(tty); + } else if (isInCodeCache()) { + CodeBlob b = getCodeBlob(); + tty.print("In "); + if (isInBlobInstructions()) { + tty.print("instructions"); + } else if (isInBlobData()) { + tty.print("data"); + } else if (isInBlobOops()) { + tty.print("oops"); + } else { + if (Assert.ASSERTS_ENABLED) { + Assert.that(isInBlobUnknownLocation(), "Should have known location in CodeBlob"); + } + tty.print("unknown location"); + } + tty.print(" in "); + b.printOn(tty); + + // FIXME: add more detail + } else if (isInStrongGlobalJNIHandleBlock() || + isInWeakGlobalJNIHandleBlock() || + isInLocalJNIHandleBlock()) { + tty.print("In "); + if (isInStrongGlobalJNIHandleBlock()) { + tty.print("strong global"); + } else if (isInWeakGlobalJNIHandleBlock()) { + tty.print("weak global"); + } else { + tty.print("thread-local"); + } + tty.print(" JNI handle block (" + handleBlock.top() + " handle slots present)"); + if (isInLocalJNIHandleBlock()) { + if (handleThread.isJavaThread()) { + tty.print(" for JavaThread "); + ((JavaThread) handleThread).printThreadIDOn(tty); + } else { + tty.print("for a non-Java Thread"); + } + } + } else { + // This must be last + if (Assert.ASSERTS_ENABLED) { + Assert.that(isUnknown(), "Should have unknown location"); + } + tty.print("In unknown location"); + } + } +}