blob: 1fd57f661082a113653ac976c1f4ec885413c637 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/**
2 * @test
3 * @bug 6459476
4 * @summary Debuggee is blocked, looks like running
5 *
6 * @author jjh
7 *
8 * @run build TestScaffold VMConnection TargetListener TargetAdapter
9 * @run compile -g InterruptHangTest.java
10 * @run main InterruptHangTest
11 */
12import com.sun.jdi.*;
13import com.sun.jdi.event.*;
14import com.sun.jdi.request.*;
15
16/*
17 * Debuggee has two threads. Debugger keeps stepping in
18 * the first thread. The second thread keeps interrupting the first
19 * thread. If a long time goes by with the debugger not getting
20 * a step event, the test fails.
21 */
22class InterruptHangTarg {
23 public static String sync = "sync";
24 public static void main(String[] args){
25 int answer = 0;
26 System.out.println("Howdy!");
27 Interruptor interruptorThread = new Interruptor(Thread.currentThread());
28
29 synchronized(sync) {
30 interruptorThread.start();
31 try {
32 sync.wait();
33 } catch (InterruptedException ee) {
34 System.out.println("Debuggee interruptee: interrupted before starting loop");
35 }
36 }
37
38 // Debugger will keep stepping thru this loop
39 for (int ii = 0; ii < 200; ii++) {
40 answer++;
41 try {
42 // Give other thread a chance to run
43 Thread.sleep(100);
44 } catch (InterruptedException ee) {
45 System.out.println("Debuggee interruptee: interrupted at iteration: "
46 + ii);
47 }
48 }
49 // Kill the interrupter thread
50 interruptorThread.interrupt();
51 System.out.println("Goodbye from InterruptHangTarg!");
52 }
53}
54
55class Interruptor extends Thread {
56 Thread interruptee;
57 Interruptor(Thread interruptee) {
58 this.interruptee = interruptee;
59 }
60
61 public void run() {
62 synchronized(InterruptHangTarg.sync) {
63 InterruptHangTarg.sync.notify();
64 }
65
66 int ii = 0;
67 while(true) {
68 ii++;
69 interruptee.interrupt();
70 try {
71 Thread.sleep(10);
72 } catch (InterruptedException ee) {
73 System.out.println("Debuggee Interruptor: finished after " +
74 ii + " iterrupts");
75 break;
76 }
77
78 }
79 }
80}
81
82 /********** test program **********/
83
84public class InterruptHangTest extends TestScaffold {
85 ThreadReference mainThread;
86 Thread timerThread;
87 String sync = "sync";
88 static int nSteps = 0;
89
90 InterruptHangTest (String args[]) {
91 super(args);
92 }
93
94 public static void main(String[] args) throws Exception {
95 new InterruptHangTest(args).startTests();
96 }
97
98 /********** event handlers **********/
99
100 public void stepCompleted(StepEvent event) {
101 synchronized(sync) {
102 nSteps++;
103 }
104 println("Got StepEvent " + nSteps + " at line " +
105 event.location().method() + ":" +
106 event.location().lineNumber());
107 if (nSteps == 1) {
108 timerThread.start();
109 }
110 }
111
112 /********** test core **********/
113
114 protected void runTests() throws Exception {
115 BreakpointEvent bpe = startToMain("InterruptHangTarg");
116 mainThread = bpe.thread();
117 EventRequestManager erm = vm().eventRequestManager();
118
119 /*
120 * Set event requests
121 */
122 StepRequest request = erm.createStepRequest(mainThread,
123 StepRequest.STEP_LINE,
124 StepRequest.STEP_OVER);
125 request.enable();
126
127 // Will be started by the step event handler
128 timerThread = new Thread("test timer") {
129 public void run() {
130 int mySteps = 0;
131 while (true) {
132 try {
133 Thread.sleep(20000);
134 synchronized(sync) {
135 System.out.println("steps = " + nSteps);
136 if (mySteps == nSteps) {
137 // no step for 10 secs
138 failure("failure: Debuggee appears to be hung");
139 vm().exit(-1);
140 break;
141 }
142 }
143 mySteps = nSteps;
144 } catch (InterruptedException ee) {
145 break;
146 }
147 }
148 }
149 };
150
151 /*
152 * resume the target listening for events
153 */
154
155 listenUntilVMDisconnect();
156 timerThread.interrupt();
157
158 /*
159 * deal with results of test
160 * if anything has called failure("foo") testFailed will be true
161 */
162 if (!testFailed) {
163 println("InterruptHangTest: passed");
164 } else {
165 throw new Exception("InterruptHangTest: failed");
166 }
167 }
168}