1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 */ 18 19 package org.apache.harmony.jpda.tests.jdwp.ThreadReference; 20 21 import org.apache.harmony.jpda.tests.share.JPDADebuggeeSynchronizer; 22 import org.apache.harmony.jpda.tests.share.SyncDebuggee; 23 24 /** 25 * The class specifies debuggee for 26 * <code>org.apache.harmony.jpda.tests.jdwp.ThreadReference.ForceEarlyReturnTest</code>. 27 * This debuggee starts the tested thread which name is supplied by test and 28 * synchronized with test via the <code>SGNL_READY</code> and 29 * <code>SGNL_CONTINUE</code> signals. 30 */ 31 public class ForceEarlyReturnDebuggee extends SyncDebuggee { 32 33 public static String threadName; 34 35 static boolean isFuncVoidBreak = true; 36 37 static TestObject testObj = new TestObject(); 38 39 public static final String THREAD_VOID = "THREAD_VOID"; 40 41 public static final String THREAD_OBJECT = "THREAD_OBJECT"; 42 43 public static final String THREAD_INT = "THREAD_INT"; 44 45 public static final String THREAD_SHORT = "THREAD_SHORT"; 46 47 public static final String THREAD_BYTE = "THREAD_BYTE"; 48 49 public static final String THREAD_CHAR = "THREAD_CHAR"; 50 51 public static final String THREAD_BOOLEAN = "THREAD_BOOLEAN"; 52 53 public static final String THREAD_LONG = "THREAD_LONG"; 54 55 public static final String THREAD_FLOAT = "THREAD_FLOAT"; 56 57 public static final String THREAD_DOUBLE = "THREAD_DOUBLE"; 58 59 public static boolean condition = true; 60 61 static Object waitForStart = new Object(); 62 63 static Object waitForFinish = new Object(); 64 65 @Override 66 public void run() { 67 synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_READY); 68 threadName = synchronizer.receiveMessage(); 69 DebuggeeThread thrd = new DebuggeeThread(threadName); 70 synchronized (waitForStart) { 71 thrd.start(); 72 try { 73 waitForStart.wait(); 74 } catch (InterruptedException e) { 75 76 } 77 } 78 synchronized (waitForFinish) { 79 logWriter.println("thread is finished"); 80 } 81 82 synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE); 83 } 84 85 public Object func_Object() { 86 logWriter.println("In func_Object"); 87 synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_READY); 88 while (condition) 89 ; 90 return new Object(); 91 } 92 93 public int func_Int() { 94 logWriter.println("In func_Int"); 95 synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_READY); 96 while (condition) 97 ; 98 return -1; 99 } 100 101 public short func_Short() { 102 logWriter.println("In func_Short"); 103 synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_READY); 104 while (condition) 105 ; 106 return -1; 107 } 108 109 public byte func_Byte() { 110 logWriter.println("In func_Byte"); 111 synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_READY); 112 while (condition) 113 ; 114 return -1; 115 } 116 117 public char func_Char() { 118 logWriter.println("In func_Char"); 119 synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_READY); 120 while (condition) 121 ; 122 return 'Z'; 123 } 124 125 public boolean func_Boolean() { 126 logWriter.println("In func_Boolean"); 127 synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_READY); 128 while (condition) 129 ; 130 return false; 131 } 132 133 public long func_Long() { 134 logWriter.println("In func_Long"); 135 synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_READY); 136 while (condition) 137 ; 138 return -1; 139 } 140 141 public float func_Float() { 142 logWriter.println("In func_Float"); 143 synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_READY); 144 while (condition) 145 ; 146 return -1; 147 } 148 149 public double func_Double() { 150 logWriter.println("In func_Double"); 151 synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_READY); 152 while (condition) 153 ; 154 return -1; 155 } 156 157 public void func_Void() { 158 logWriter.println("In func_Void"); 159 synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_READY); 160 while (condition) 161 ; 162 isFuncVoidBreak = false; 163 return; 164 } 165 166 class DebuggeeThread extends Thread { 167 168 public DebuggeeThread(String name) { 169 super(name); 170 } 171 172 @Override 173 public void run() { 174 175 synchronized (ForceEarlyReturnDebuggee.waitForFinish) { 176 177 synchronized (ForceEarlyReturnDebuggee.waitForStart) { 178 179 ForceEarlyReturnDebuggee.waitForStart.notifyAll(); 180 181 logWriter.println(getName() + ": started"); 182 183 if (getName().equals(THREAD_OBJECT)) { 184 Object result = func_Object(); 185 logWriter.println(getName() + ": " + "Object"); 186 if (result instanceof TestObject) { 187 synchronizer.sendMessage("TRUE"); 188 } else { 189 synchronizer.sendMessage("FALSE"); 190 } 191 logWriter 192 .println(getName() + ": func_Object returned."); 193 194 } else if (getName().equals(THREAD_INT)) { 195 int result = func_Int(); 196 logWriter.println(getName() + ": " + result); 197 synchronizer 198 .sendMessage(new Integer(result).toString()); 199 logWriter.println(getName() + ": func_Int returned."); 200 } else if (getName().equals(THREAD_SHORT)) { 201 short result = func_Short(); 202 logWriter.println(getName() + ": " + result); 203 synchronizer 204 .sendMessage(new Integer(result).toString()); 205 logWriter.println(getName() + ": func_Short returned."); 206 } else if (getName().equals(THREAD_BYTE)) { 207 byte result = func_Byte(); 208 logWriter.println(getName() + ": " + result); 209 synchronizer 210 .sendMessage(new Integer(result).toString()); 211 logWriter.println(getName() + ": func_Byte returned."); 212 } else if (getName().equals(THREAD_CHAR)) { 213 char result = func_Char(); 214 logWriter.println(getName() + ": " + result); 215 synchronizer.sendMessage(new Character(result) 216 .toString()); 217 logWriter.println(getName() + ": func_Char returned."); 218 } else if (getName().equals(THREAD_BOOLEAN)) { 219 Boolean result = func_Boolean(); 220 logWriter.println(getName() + ": " + result); 221 synchronizer 222 .sendMessage(new Boolean(result).toString()); 223 logWriter.println(getName() 224 + ": func_Boolean returned."); 225 } else if (getName().equals(THREAD_LONG)) { 226 long result = func_Long(); 227 logWriter.println(getName() + ": " + result); 228 synchronizer.sendMessage(new Long(result).toString()); 229 logWriter.println(getName() + ": func_Long returned."); 230 } else if (getName().equals(THREAD_FLOAT)) { 231 float result = func_Float(); 232 logWriter.println(getName() + ": " + result); 233 synchronizer.sendMessage(new Float(result).toString()); 234 logWriter.println(getName() + ": func_Float returned."); 235 } else if (getName().equals(THREAD_DOUBLE)) { 236 double result = func_Double(); 237 logWriter.println(getName() + ": " + result); 238 synchronizer.sendMessage(new Double(result).toString()); 239 logWriter 240 .println(getName() + ": func_Double returned."); 241 } else if (getName().equals(THREAD_VOID)) { 242 func_Void(); 243 logWriter.println(getName() + ": " + "void"); 244 if (isFuncVoidBreak) { 245 synchronizer.sendMessage("TRUE"); 246 } else { 247 synchronizer.sendMessage("FALSE"); 248 } 249 logWriter.println(getName() + ": func_Void returned."); 250 } else { 251 logWriter.println(getName() + ": no func is called."); 252 synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_READY); 253 synchronizer.receiveMessage("ThreadExit"); 254 } 255 256 logWriter.println(getName() + ": finished"); 257 258 } 259 } 260 } 261 } 262 263 public static void main(String[] args) { 264 runDebuggee(ForceEarlyReturnDebuggee.class); 265 } 266 267 } 268 269 class TestObject { 270 271 } 272