# HG changeset patch # User coleenp # Date 1334329896 25200 # Node ID 0f701f572aed3e83bedacf051a03832158e0cd9f # Parent df4cd4aac5c19f80d526b61daec0ca2e180c04e4# Parent 27dab8a7c762792f6047ce3c70927a5539f6484a Merge diff -r df4cd4aac5c1 -r 0f701f572aed test/runtime/7158988/TestPostFieldModification.java --- a/test/runtime/7158988/TestPostFieldModification.java Thu Apr 12 13:24:08 2012 +0200 +++ b/test/runtime/7158988/TestPostFieldModification.java Fri Apr 13 08:11:36 2012 -0700 @@ -21,229 +21,38 @@ * questions. */ -/* - * @test FieldMonitor.java - * @bug 7158988 - * @summary verify jvm does not crash while debugging - * @run shell TestFieldMonitor.sh - * @author axel.siebenborn@sap.com - */ -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.Reader; -import java.io.Writer; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +public class TestPostFieldModification { -import com.sun.jdi.Bootstrap; -import com.sun.jdi.Field; -import com.sun.jdi.ReferenceType; -import com.sun.jdi.VirtualMachine; -import com.sun.jdi.connect.Connector; -import com.sun.jdi.connect.IllegalConnectorArgumentsException; -import com.sun.jdi.connect.LaunchingConnector; -import com.sun.jdi.connect.VMStartException; -import com.sun.jdi.event.ClassPrepareEvent; -import com.sun.jdi.event.Event; -import com.sun.jdi.event.EventQueue; -import com.sun.jdi.event.EventSet; -import com.sun.jdi.event.ModificationWatchpointEvent; -import com.sun.jdi.event.VMDeathEvent; -import com.sun.jdi.event.VMDisconnectEvent; -import com.sun.jdi.request.ClassPrepareRequest; -import com.sun.jdi.request.EventRequest; -import com.sun.jdi.request.EventRequestManager; -import com.sun.jdi.request.ModificationWatchpointRequest; + public String value; // watch modification of value -public class FieldMonitor { - - public static final String CLASS_NAME = "TestPostFieldModification"; - public static final String FIELD_NAME = "value"; - public static final String ARGUMENTS = "-Xshare:off -XX:+PrintGC"; - - public static void main(String[] args) - throws IOException, InterruptedException { - - StringBuffer sb = new StringBuffer(); + public static void main(String[] args){ - for (int i=0; i < args.length; i++) { - sb.append(' '); - sb.append(args[i]); - } - //VirtualMachine vm = launchTarget(sb.toString()); - VirtualMachine vm = launchTarget(CLASS_NAME); - - System.out.println("Vm launched"); - // set watch field on already loaded classes - List referenceTypes = vm - .classesByName(CLASS_NAME); - for (ReferenceType refType : referenceTypes) { - addFieldWatch(vm, refType); - } - // watch for loaded classes - addClassWatch(vm); - - // process events - EventQueue eventQueue = vm.eventQueue(); - // resume the vm - - Process process = vm.process(); - - - // Copy target's output and error to our output and error. - Thread outThread = new StreamRedirectThread("out reader", process.getInputStream()); - Thread errThread = new StreamRedirectThread("error reader", process.getErrorStream()); - - errThread.start(); - outThread.start(); - - - vm.resume(); - boolean connected = true; - while (connected) { - EventSet eventSet = eventQueue.remove(); - for (Event event : eventSet) { - if (event instanceof VMDeathEvent - || event instanceof VMDisconnectEvent) { - // exit - connected = false; - } else if (event instanceof ClassPrepareEvent) { - // watch field on loaded class - System.out.println("ClassPrepareEvent"); - ClassPrepareEvent classPrepEvent = (ClassPrepareEvent) event; - ReferenceType refType = classPrepEvent - .referenceType(); - addFieldWatch(vm, refType); - } else if (event instanceof ModificationWatchpointEvent) { - System.out.println("sleep for 500 ms"); - Thread.sleep(500); - System.out.println("resume..."); - - ModificationWatchpointEvent modEvent = (ModificationWatchpointEvent) event; - System.out.println("old=" - + modEvent.valueCurrent()); - System.out.println("new=" + modEvent.valueToBe()); - System.out.println(); + System.out.println("Start threads"); + // this thread modifies the field 'value' + new Thread() { + TestPostFieldModification test = new TestPostFieldModification(); + public void run() { + test.value="test"; + for(int i = 0; i < 10; i++) { + test.value += new String("_test"); } } - eventSet.resume(); - } - // Shutdown begins when event thread terminates - try { - errThread.join(); // Make sure output is forwarded - outThread.join(); - } catch (InterruptedException exc) { - // we don't interrupt - } - } - - /** - * Find a com.sun.jdi.CommandLineLaunch connector - */ - static LaunchingConnector findLaunchingConnector() { - List connectors = Bootstrap.virtualMachineManager().allConnectors(); - Iterator iter = connectors.iterator(); - while (iter.hasNext()) { - Connector connector = iter.next(); - if (connector.name().equals("com.sun.jdi.CommandLineLaunch")) { - return (LaunchingConnector)connector; - } - } - throw new Error("No launching connector"); - } - /** - * Return the launching connector's arguments. - */ - static Map connectorArguments(LaunchingConnector connector, String mainArgs) { - Map arguments = connector.defaultArguments(); - for (String key : arguments.keySet()) { - System.out.println(key); - } - - Connector.Argument mainArg = (Connector.Argument)arguments.get("main"); - if (mainArg == null) { - throw new Error("Bad launching connector"); - } - mainArg.setValue(mainArgs); + }.start(); - Connector.Argument optionsArg = (Connector.Argument)arguments.get("options"); - if (optionsArg == null) { - throw new Error("Bad launching connector"); - } - optionsArg.setValue(ARGUMENTS); - return arguments; - } + // this thread is used to trigger a gc + Thread d = new Thread() { + public void run() { + while(true) { + try { + Thread.sleep(100); + } catch (InterruptedException e) { - static VirtualMachine launchTarget(String mainArgs) { - LaunchingConnector connector = findLaunchingConnector(); - Map arguments = connectorArguments(connector, mainArgs); - try { - return (VirtualMachine) connector.launch(arguments); - } catch (IOException exc) { - throw new Error("Unable to launch target VM: " + exc); - } catch (IllegalConnectorArgumentsException exc) { - throw new Error("Internal error: " + exc); - } catch (VMStartException exc) { - throw new Error("Target VM failed to initialize: " + - exc.getMessage()); - } -} - - - private static void addClassWatch(VirtualMachine vm) { - EventRequestManager erm = vm.eventRequestManager(); - ClassPrepareRequest classPrepareRequest = erm - .createClassPrepareRequest(); - classPrepareRequest.addClassFilter(CLASS_NAME); - classPrepareRequest.setEnabled(true); - } - - - private static void addFieldWatch(VirtualMachine vm, - ReferenceType refType) { - EventRequestManager erm = vm.eventRequestManager(); - Field field = refType.fieldByName(FIELD_NAME); - ModificationWatchpointRequest modificationWatchpointRequest = erm - .createModificationWatchpointRequest(field); - modificationWatchpointRequest.setSuspendPolicy(EventRequest.SUSPEND_EVENT_THREAD); - modificationWatchpointRequest.setEnabled(true); + } + System.gc(); + } + } + }; + d.setDaemon(true); + d.start(); } } - -class StreamRedirectThread extends Thread { - - private final BufferedReader in; - - private static final int BUFFER_SIZE = 2048; - - /** - * Set up for copy. - * @param name Name of the thread - * @param in Stream to copy from - * @param out Stream to copy to - */ - StreamRedirectThread(String name, InputStream in) { - super(name); - this.in = new BufferedReader(new InputStreamReader(in)); - } - - /** - * Copy. - */ - public void run() { - try { - String line; - while ((line = in.readLine ()) != null) { - System.out.println ("testvm: " + line); - } - System.out.flush(); - } catch(IOException exc) { - System.err.println("Child I/O Transfer - " + exc); - } - } -}