diff options
Diffstat (limited to 'kamon-autoweave/src/main/java/sun/tools/attach/HotSpotVirtualMachine.java')
-rw-r--r-- | kamon-autoweave/src/main/java/sun/tools/attach/HotSpotVirtualMachine.java | 289 |
1 files changed, 0 insertions, 289 deletions
diff --git a/kamon-autoweave/src/main/java/sun/tools/attach/HotSpotVirtualMachine.java b/kamon-autoweave/src/main/java/sun/tools/attach/HotSpotVirtualMachine.java deleted file mode 100644 index 0bc04b04..00000000 --- a/kamon-autoweave/src/main/java/sun/tools/attach/HotSpotVirtualMachine.java +++ /dev/null @@ -1,289 +0,0 @@ -/* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. 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. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package sun.tools.attach; - -import com.sun.tools.attach.VirtualMachine; -import com.sun.tools.attach.AgentLoadException; -import com.sun.tools.attach.AgentInitializationException; -import com.sun.tools.attach.spi.AttachProvider; - -import java.io.InputStream; -import java.io.IOException; -import java.util.Properties; -import java.util.Map; - -/* - * The HotSpot implementation of com.sun.tools.attach.VirtualMachine. - */ - -public abstract class HotSpotVirtualMachine extends VirtualMachine { - - HotSpotVirtualMachine(AttachProvider provider, String id) { - super(provider, id); - } - - /* - * Load agent library - * If isAbsolute is true then the agent library is the absolute path - * to the library and thus will not be expanded in the target VM. - * if isAbsolute is false then the agent library is just a library - * name and it will be expended in the target VM. - */ - private void loadAgentLibrary(String agentLibrary, boolean isAbsolute, String options) - throws AgentLoadException, AgentInitializationException, IOException - { - InputStream in = execute("load", - agentLibrary, - isAbsolute ? "true" : "false", - options); - try { - int result = readInt(in); - if (result != 0) { - throw new AgentInitializationException("Agent_OnAttach failed", result); - } - } finally { - in.close(); - - } - } - - /* - * Load agent library - library name will be expanded in target VM - */ - public void loadAgentLibrary(String agentLibrary, String options) - throws AgentLoadException, AgentInitializationException, IOException - { - loadAgentLibrary(agentLibrary, false, options); - } - - /* - * Load agent - absolute path of library provided to target VM - */ - public void loadAgentPath(String agentLibrary, String options) - throws AgentLoadException, AgentInitializationException, IOException - { - loadAgentLibrary(agentLibrary, true, options); - } - - /* - * Load JPLIS agent which will load the agent JAR file and invoke - * the agentmain method. - */ - public void loadAgent(String agent, String options) - throws AgentLoadException, AgentInitializationException, IOException - { - String args = agent; - if (options != null) { - args = args + "=" + options; - } - try { - loadAgentLibrary("instrument", args); - } catch (AgentLoadException x) { - throw new InternalError("instrument library is missing in target VM"); - } catch (AgentInitializationException x) { - /* - * Translate interesting errors into the right exception and - * message (FIXME: create a better interface to the instrument - * implementation so this isn't necessary) - */ - int rc = x.returnValue(); - switch (rc) { - case JNI_ENOMEM: - throw new AgentLoadException("Insuffient memory"); - case ATTACH_ERROR_BADJAR: - throw new AgentLoadException("Agent JAR not found or no Agent-Class attribute"); - case ATTACH_ERROR_NOTONCP: - throw new AgentLoadException("Unable to add JAR file to system class path"); - case ATTACH_ERROR_STARTFAIL: - throw new AgentInitializationException("Agent JAR loaded but agent failed to initialize"); - default : - throw new AgentLoadException("Failed to load agent - unknown reason: " + rc); - } - } - } - - /* - * The possible errors returned by JPLIS's agentmain - */ - private static final int JNI_ENOMEM = -4; - private static final int ATTACH_ERROR_BADJAR = 100; - private static final int ATTACH_ERROR_NOTONCP = 101; - private static final int ATTACH_ERROR_STARTFAIL = 102; - - - /* - * Send "properties" command to target VM - */ - public Properties getSystemProperties() throws IOException { - InputStream in = null; - Properties props = new Properties(); - try { - in = executeCommand("properties"); - props.load(in); - } finally { - if (in != null) in.close(); - } - return props; - } - - public Properties getAgentProperties() throws IOException { - InputStream in = null; - Properties props = new Properties(); - try { - in = executeCommand("agentProperties"); - props.load(in); - } finally { - if (in != null) in.close(); - } - return props; - } - - // --- HotSpot specific methods --- - - // same as SIGQUIT - public void localDataDump() throws IOException { - executeCommand("datadump").close(); - } - - // Remote ctrl-break. The output of the ctrl-break actions can - // be read from the input stream. - public InputStream remoteDataDump(Object ... args) throws IOException { - return executeCommand("threaddump", args); - } - - // Remote heap dump. The output (error message) can be read from the - // returned input stream. - public InputStream dumpHeap(Object ... args) throws IOException { - return executeCommand("dumpheap", args); - } - - // Heap histogram (heap inspection in HotSpot) - public InputStream heapHisto(Object ... args) throws IOException { - return executeCommand("inspectheap", args); - } - - // set JVM command line flag - public InputStream setFlag(String name, String value) throws IOException { - return executeCommand("setflag", name, value); - } - - // print command line flag - public InputStream printFlag(String name) throws IOException { - return executeCommand("printflag", name); - } - - public InputStream executeJCmd(String command) throws IOException { - return executeCommand("jcmd", command); - } - - // -- Supporting methods - - - /* - * Execute the given command in the target VM - specific platform - * implementation must implement this. - */ - abstract InputStream execute(String cmd, Object ... args) - throws AgentLoadException, IOException; - - /* - * Convenience method for simple commands - */ - private InputStream executeCommand(String cmd, Object ... args) throws IOException { - try { - return execute(cmd, args); - } catch (AgentLoadException x) { - throw new InternalError("Should not get here"); - } - } - - - /* - * Utility method to read an 'int' from the input stream. Ideally - * we should be using java.util.Scanner here but this implementation - * guarantees not to read ahead. - */ - int readInt(InputStream in) throws IOException { - StringBuilder sb = new StringBuilder(); - - // read to \n or EOF - int n; - byte buf[] = new byte[1]; - do { - n = in.read(buf, 0, 1); - if (n > 0) { - char c = (char)buf[0]; - if (c == '\n') { - break; // EOL found - } else { - sb.append(c); - } - } - } while (n > 0); - - if (sb.length() == 0) { - throw new IOException("Premature EOF"); - } - - int value; - try { - value = Integer.parseInt(sb.toString()); - } catch (NumberFormatException x) { - throw new IOException("Non-numeric value found - int expected"); - } - return value; - } - - // -- attach timeout support - - private static long defaultAttachTimeout = 5000; - private volatile long attachTimeout; - - /* - * Return attach timeout based on the value of the sun.tools.attach.attachTimeout - * property, or the default timeout if the property is not set to a positive - * value. - */ - long attachTimeout() { - if (attachTimeout == 0) { - synchronized(this) { - if (attachTimeout == 0) { - try { - String s = - System.getProperty("sun.tools.attach.attachTimeout"); - attachTimeout = Long.parseLong(s); - } catch (SecurityException se) { - } catch (NumberFormatException ne) { - } - if (attachTimeout <= 0) { - attachTimeout = defaultAttachTimeout; - } - } - } - } - return attachTimeout; - } -} |