--- old/test/runtime/7158988/FieldMonitor.java 2014-02-12 17:36:30.000000000 +0100 +++ new/test/runtime/7158988/FieldMonitor.java 2014-02-12 17:36:30.000000000 +0100 @@ -34,13 +34,10 @@ 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; +import java.io.PrintWriter; import com.sun.jdi.Bootstrap; import com.sun.jdi.Field; @@ -51,6 +48,7 @@ import com.sun.jdi.connect.LaunchingConnector; import com.sun.jdi.connect.VMStartException; import com.sun.jdi.event.ClassPrepareEvent; +import com.sun.jdi.event.VMStartEvent; import com.sun.jdi.event.Event; import com.sun.jdi.event.EventQueue; import com.sun.jdi.event.EventSet; @@ -70,37 +68,39 @@ public static void main(String[] args) throws IOException, InterruptedException { - - StringBuffer sb = new StringBuffer(); - - for (int i=0; i < args.length; i++) { - sb.append(' '); - sb.append(args[i]); - } - //VirtualMachine vm = launchTarget(sb.toString()); + VirtualMachine vm = launchTarget(CLASS_NAME); + EventQueue eventQueue = vm.eventQueue(); + + // make sure the vm is started + boolean started = false; + while(!started) { + EventSet eventSet = eventQueue.remove(); + for (Event event : eventSet) { + if (event instanceof VMStartEvent) { + started = true; + } + if (event instanceof VMDeathEvent + || event instanceof VMDisconnectEvent) { + throw new Error("VM died before it started...:"+event); + } + } + } 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()); - + + PrintWriter vmPrinter = null; errThread.start(); outThread.start(); @@ -109,7 +109,7 @@ boolean connected = true; while (connected) { EventSet eventSet = eventQueue.remove(); - for (Event event : eventSet) { + for (Event event : eventSet) { if (event instanceof VMDeathEvent || event instanceof VMDisconnectEvent) { // exit @@ -121,6 +121,13 @@ ReferenceType refType = classPrepEvent .referenceType(); addFieldWatch(vm, refType); + + // inform TestPostFieldModification that it can exit. // JDK-8007710 + if (vmPrinter == null) { + vmPrinter = new PrintWriter(process.getOutputStream()); + vmPrinter.println(""); + vmPrinter.flush(); + } } else if (event instanceof ModificationWatchpointEvent) { System.out.println("sleep for 500 ms"); Thread.sleep(500);