comparison test/runtime/7158988/FieldMonitor.java @ 18041:52b4284cb496

Merge with jdk8u20-b26
author Gilles Duboscq <duboscq@ssw.jku.at>
date Wed, 15 Oct 2014 16:02:50 +0200
parents 4ca6dc0799b6
children
comparison
equal deleted inserted replaced
17606:45d7b2c7029d 18041:52b4284cb496
32 */ 32 */
33 import java.io.BufferedReader; 33 import java.io.BufferedReader;
34 import java.io.IOException; 34 import java.io.IOException;
35 import java.io.InputStream; 35 import java.io.InputStream;
36 import java.io.InputStreamReader; 36 import java.io.InputStreamReader;
37 import java.io.OutputStream;
38 import java.io.OutputStreamWriter;
39 import java.io.Reader;
40 import java.io.Writer;
41 import java.util.Iterator; 37 import java.util.Iterator;
42 import java.util.List; 38 import java.util.List;
43 import java.util.Map; 39 import java.util.Map;
44 40
45 import com.sun.jdi.Bootstrap; 41 import com.sun.jdi.Bootstrap;
54 import com.sun.jdi.event.Event; 50 import com.sun.jdi.event.Event;
55 import com.sun.jdi.event.EventQueue; 51 import com.sun.jdi.event.EventQueue;
56 import com.sun.jdi.event.EventSet; 52 import com.sun.jdi.event.EventSet;
57 import com.sun.jdi.event.ModificationWatchpointEvent; 53 import com.sun.jdi.event.ModificationWatchpointEvent;
58 import com.sun.jdi.event.VMDeathEvent; 54 import com.sun.jdi.event.VMDeathEvent;
55 import com.sun.jdi.event.VMStartEvent;
59 import com.sun.jdi.event.VMDisconnectEvent; 56 import com.sun.jdi.event.VMDisconnectEvent;
60 import com.sun.jdi.request.ClassPrepareRequest; 57 import com.sun.jdi.request.ClassPrepareRequest;
61 import com.sun.jdi.request.EventRequest; 58 import com.sun.jdi.request.EventRequest;
62 import com.sun.jdi.request.EventRequestManager; 59 import com.sun.jdi.request.EventRequestManager;
63 import com.sun.jdi.request.ModificationWatchpointRequest; 60 import com.sun.jdi.request.ModificationWatchpointRequest;
69 public static final String ARGUMENTS = "-Xshare:off -XX:+PrintGC"; 66 public static final String ARGUMENTS = "-Xshare:off -XX:+PrintGC";
70 67
71 public static void main(String[] args) 68 public static void main(String[] args)
72 throws IOException, InterruptedException { 69 throws IOException, InterruptedException {
73 70
74 StringBuffer sb = new StringBuffer();
75
76 for (int i=0; i < args.length; i++) {
77 sb.append(' ');
78 sb.append(args[i]);
79 }
80 //VirtualMachine vm = launchTarget(sb.toString()); 71 //VirtualMachine vm = launchTarget(sb.toString());
81 VirtualMachine vm = launchTarget(CLASS_NAME); 72 VirtualMachine vm = launchTarget(CLASS_NAME);
82 73
83 System.out.println("Vm launched"); 74 System.out.println("Vm launched");
84 // set watch field on already loaded classes
85 List<ReferenceType> referenceTypes = vm
86 .classesByName(CLASS_NAME);
87 for (ReferenceType refType : referenceTypes) {
88 addFieldWatch(vm, refType);
89 }
90 // watch for loaded classes
91 addClassWatch(vm);
92 75
93 // process events 76 // process events
94 EventQueue eventQueue = vm.eventQueue(); 77 EventQueue eventQueue = vm.eventQueue();
95 // resume the vm 78 // resume the vm
96 79
102 Thread errThread = new StreamRedirectThread("error reader", process.getErrorStream()); 85 Thread errThread = new StreamRedirectThread("error reader", process.getErrorStream());
103 86
104 errThread.start(); 87 errThread.start();
105 outThread.start(); 88 outThread.start();
106 89
107
108 vm.resume();
109 boolean connected = true; 90 boolean connected = true;
91 int watched = 0;
110 while (connected) { 92 while (connected) {
111 EventSet eventSet = eventQueue.remove(); 93 EventSet eventSet = eventQueue.remove();
112 for (Event event : eventSet) { 94 for (Event event : eventSet) {
113 if (event instanceof VMDeathEvent 95 System.out.println("FieldMonitor-main receives: "+event);
96 if (event instanceof VMStartEvent) {
97 addClassWatch(vm);
98 } else if (event instanceof VMDeathEvent
114 || event instanceof VMDisconnectEvent) { 99 || event instanceof VMDisconnectEvent) {
115 // exit 100 // exit
116 connected = false; 101 connected = false;
117 } else if (event instanceof ClassPrepareEvent) { 102 } else if (event instanceof ClassPrepareEvent) {
118 // watch field on loaded class 103 // watch field on loaded class
120 ClassPrepareEvent classPrepEvent = (ClassPrepareEvent) event; 105 ClassPrepareEvent classPrepEvent = (ClassPrepareEvent) event;
121 ReferenceType refType = classPrepEvent 106 ReferenceType refType = classPrepEvent
122 .referenceType(); 107 .referenceType();
123 addFieldWatch(vm, refType); 108 addFieldWatch(vm, refType);
124 } else if (event instanceof ModificationWatchpointEvent) { 109 } else if (event instanceof ModificationWatchpointEvent) {
110 watched++;
125 System.out.println("sleep for 500 ms"); 111 System.out.println("sleep for 500 ms");
126 Thread.sleep(500); 112 Thread.sleep(500);
127 System.out.println("resume...");
128 113
129 ModificationWatchpointEvent modEvent = (ModificationWatchpointEvent) event; 114 ModificationWatchpointEvent modEvent = (ModificationWatchpointEvent) event;
130 System.out.println("old=" 115 System.out.println("old="
131 + modEvent.valueCurrent()); 116 + modEvent.valueCurrent());
132 System.out.println("new=" + modEvent.valueToBe()); 117 System.out.println("new=" + modEvent.valueToBe());
133 System.out.println();
134 } 118 }
135 } 119 }
120 System.out.println("resume...");
136 eventSet.resume(); 121 eventSet.resume();
137 } 122 }
138 // Shutdown begins when event thread terminates 123 // Shutdown begins when event thread terminates
139 try { 124 try {
140 errThread.join(); // Make sure output is forwarded 125 errThread.join(); // Make sure output is forwarded
141 outThread.join(); 126 outThread.join();
142 } catch (InterruptedException exc) { 127 } catch (InterruptedException exc) {
143 // we don't interrupt 128 // we don't interrupt
129 }
130
131 if (watched != 11) { // init + 10 modifications in TestPostFieldModification class
132 throw new Error("Expected to receive 11 times ModificationWatchpointEvent, but got "+watched);
144 } 133 }
145 } 134 }
146 135
147 /** 136 /**
148 * Find a com.sun.jdi.CommandLineLaunch connector 137 * Find a com.sun.jdi.CommandLineLaunch connector