/******************************************************************************* * Copyright (c) 2000, 2011 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.jdi.hcr; /** * Hot code replacement extension to <code>com.sun.jdi.VirtualMachine</code>. */ public interface VirtualMachine { /** All the given type were reloaded */ public static final int RELOAD_SUCCESS = 0; /** The VM is inconsistent after the reload operation */ public static final int RELOAD_FAILURE = 1; /** The reload operation was ignored */ public static final int RELOAD_IGNORED = 2; /** * Determines if this implementation supports the early return of the top * stack frame of a thread. * * @return <code>true</code> if the feature is supported, <code>false</code> * otherwise. */ public boolean canDoReturn(); /** * Determines if this implementation supports the retrieval of a class file * version. * * @return <code>true</code> if the feature is supported, <code>false</code> * otherwise. */ public boolean canGetClassFileVersion(); /** * Determines if this implementation supports the reenter stepping. * * @return <code>true</code> if the feature is supported, <code>false</code> * otherwise. */ public boolean canReenterOnExit(); /** * Determines if this implementation supports the replacement of classes on * the fly. * * @return <code>true</code> if the feature is supported, <code>false</code> * otherwise. */ public boolean canReloadClasses(); /** * Notifies the VM that the class file base that it is running from has * changed. Classes are given by their names. * <p> * The class file base is the collection of class files available on the * various VM's class paths consulted by the class loaders that are integral * to the system. In JDK 1.2, these would include all files on the boot * class path (used by the bootstrap class loader), the extension directory * (used by the extension class loader), and the regular class path (used by * the application class loader). The notion is important because only those * classes that the VM knows to be in the class file base will be eligible * for hot code replacement. Classes that are actually loaded by * non-standard class loaders cannot be replaced on the fly (because the VM * has no way of asking non-standard class loaders to reload them). Classes * loaded from the class file base by cooperating class loaders are said to * be HCR-eligible. * <p> * The VM is expected to: * <ol> * <li>Suspend all running threads. * <li>For a given JNI signature, try to find the definition of the * corresponding class. * <ul> * <li>If the class definition can be found then it replaces the previous * definition for that class. * <li>If a definition for the class is not found, then it is unloaded. * <ul> * <li>This operation returns only when the classes have been reloaded * and/or deleted. * <li>If the suspend policy of the class unload event is not to suspend the * VM, then the VM resumes all the threads that it has suspended. * <li>Finally for each class that has been reloaded, the VM is expected to * <ul> * <li>send a class unload event, * <li>note the VM is already suspended if the suspend policy of class * unload event said so, * <li>when the frontend resumes the VM, send a class prepare event, * <li>suspend the VM according to the suspend policy of the class prepare * event request. * </ul> * <li>For each class that has been unloaded, the VM is expected to * <ul> * <li>send a class unload event, * <li>suspend the VM if it was requested by the class unload event request. * </ul> * </ol> * <p> * Subsequent references to classes will work with the new class definition. * Note the existing <code>com.sun.jdi.ReferenceType</code>, * <code>com.sun.jdi.Method</code> and <code>com.sun.jdi.Field</code> still * refer to the old class definition. So they should be discarded when the * class unload event come in. * <p> * The VM does not discard stack frames automatically: * <ul> * <li>methods on the stack are not affected, and could therefore be * referencing obsolete code * <li>replacing a class does not affect anything on the stack * <li>subsequent class and method lookups find the replacements * </ul> * <p> * Installed breakpoints are not automatically carried over to the reloaded * class: * <ul> * <li>breakpoints are resolved to particular locations in particular * classes and methods * <li>the VM must clear breakpoints to methods in classes that have been * reloaded or unloaded (the debugger will reinstall them when it gets the * class prepare event.) * </ul> * <p> * A change notice encompasses changes to the content of a class file in the * base, the addition of a class files to the base, and the removal of a * class file from the base. * <p> * Change notices apply to all classes that are HCR-eligible (i.e., loaded * by one of the cooperative system class loaders); other classes are never * affected. * <p> * Returns whether the operation could be completed as specified above, * whether it was ignored (for example if the VM doesn't support this kind * of replacement), or whether the operation failed and the VM should be * restarted. * @param arg1 the names of the classes that have changed * @return whether the operation could be completed as specified above, * whether it was ignored (for example if the VM doesn't support this kind * of replacement), or whether the operation failed and the VM should be * restarted * */ public int classesHaveChanged(String[] arg1); }