test/runtime/7158988/FieldMonitor.java

Print this page

        

@@ -32,27 +32,25 @@
  */
 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;
+import java.io.PrintWriter;
 
 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.VMStartEvent;
 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;

@@ -69,40 +67,42 @@
   public static final String ARGUMENTS = "-Xshare:off -XX:+PrintGC";
 
   public static void main(String[] args)
       throws IOException, InterruptedException {
 
-    StringBuffer sb = new StringBuffer();
+    VirtualMachine vm = launchTarget(CLASS_NAME);
+    EventQueue eventQueue = vm.eventQueue();
 
-    for (int i=0; i < args.length; i++) {
-        sb.append(' ');
-        sb.append(args[i]);
+    // 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);
+        }
+      }
     }
-    //VirtualMachine vm = launchTarget(sb.toString());
-    VirtualMachine vm = launchTarget(CLASS_NAME);
 
     System.out.println("Vm launched");
-    // set watch field on already loaded classes
-    List<ReferenceType> 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();
 
 
     vm.resume();

@@ -119,10 +119,17 @@
           System.out.println("ClassPrepareEvent");
           ClassPrepareEvent classPrepEvent = (ClassPrepareEvent) event;
           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);
           System.out.println("resume...");