test/runtime/7158988/FieldMonitor.java

Print this page

        

@@ -32,14 +32,10 @@
  */
 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 com.sun.jdi.Bootstrap;

@@ -54,10 +50,11 @@
 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.VMStartEvent;
 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;

@@ -69,28 +66,14 @@
   public static final String ARGUMENTS = "-Xshare:off -XX:+PrintGC";
 
   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);
 
     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
 

@@ -102,17 +85,19 @@
     Thread errThread = new StreamRedirectThread("error reader", process.getErrorStream());
 
     errThread.start();
     outThread.start();
 
-
-    vm.resume();
     boolean connected = true;
+    boolean watched = false;
     while (connected) {
       EventSet eventSet = eventQueue.remove();
       for (Event event : eventSet) {
-        if (event instanceof VMDeathEvent
+        System.out.println("FieldMonitor-main receives: "+event);
+        if (event instanceof VMStartEvent) {
+          addClassWatch(vm);
+        } else if (event instanceof VMDeathEvent
             || event instanceof VMDisconnectEvent) {
           // exit
           connected = false;
         } else if (event instanceof ClassPrepareEvent) {
           // watch field on loaded class

@@ -120,10 +105,11 @@
           ClassPrepareEvent classPrepEvent = (ClassPrepareEvent) event;
           ReferenceType refType = classPrepEvent
               .referenceType();
           addFieldWatch(vm, refType);
         } else if (event instanceof ModificationWatchpointEvent) {
+          watched = true;
           System.out.println("sleep for 500 ms");
           Thread.sleep(500);
           System.out.println("resume...");
 
           ModificationWatchpointEvent modEvent = (ModificationWatchpointEvent) event;

@@ -140,10 +126,14 @@
         errThread.join(); // Make sure output is forwarded
         outThread.join();
     } catch (InterruptedException exc) {
         // we don't interrupt
     }
+    
+    if (!watched) {
+        throw new Error("Did not receive ModificationWatchpointEvent!");
+    }
   }
 
   /**
    * Find a com.sun.jdi.CommandLineLaunch connector
    */