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/** 20 * @author Anatoly F. Bondarenko 21 */ 22 23/** 24 * Created on 06.06.2006 25 */ 26 27package org.apache.harmony.jpda.tests.jdwp.ThreadReference; 28 29import org.apache.harmony.jpda.tests.share.SyncDebuggee; 30 31public class SuspendDebuggee extends SyncDebuggee { 32 public static final int THREAD_NUMBER_LIMIT = 9; 33 public static final String THREAD_NAME_PATTERN = "SuspendDebuggee_Thread_"; 34 35 static SuspendDebuggee suspendDebuggeeThis; 36 37 static volatile boolean allThreadsToFinish = false; 38 static int createdThreadsNumber = 0; 39 static volatile int startedThreadsNumber = 0; 40 41 static SuspendDebuggee_Thread[] suspendDebuggeeThreads = null; 42 43 static Object waitTimeObject = new Object(); 44 static void waitMlsecsTime(long mlsecsTime) { 45 synchronized(waitTimeObject) { 46 try { 47 waitTimeObject.wait(mlsecsTime); 48 } catch (Throwable throwable) { 49 // ignore 50 } 51 } 52 } 53 54 static void sleepMlsecsTime(long mlsecsTime) { 55 try { 56 Thread.sleep(mlsecsTime); 57 } catch (Throwable throwable) { 58 // ignore 59 } 60 } 61 62 public void run() { 63 64 logWriter.println("--> SuspendDebuggee: START..."); 65 suspendDebuggeeThis = this; 66 67 logWriter.println("--> SuspendDebuggee: Create and start tested threads..."); 68 try { 69 suspendDebuggeeThreads = new SuspendDebuggee_Thread[THREAD_NUMBER_LIMIT]; 70 for (int i=0; i < THREAD_NUMBER_LIMIT; i++) { 71 suspendDebuggeeThreads[i]= new SuspendDebuggee_Thread(i); 72 suspendDebuggeeThreads[i].start(); 73 createdThreadsNumber++; 74 } 75 } catch ( Throwable thrown) { 76 logWriter.println 77 ("--> SuspendDebuggee: Exception while creating threads: " + thrown); 78 } 79 logWriter.println 80 ("--> SuspendDebuggee: Created threads number = " + createdThreadsNumber); 81 82 while ( startedThreadsNumber != createdThreadsNumber ) { 83 waitMlsecsTime(100); 84 } 85 if ( createdThreadsNumber != 0 ) { 86 logWriter.println("--> SuspendDebuggee: All created threads are started!"); 87 } 88 89 synchronizer.sendMessage(Integer.toString(createdThreadsNumber)); 90 if ( createdThreadsNumber == 0 ) { 91 logWriter.println("--> SuspendDebuggee: FINISH..."); 92 return; 93 } 94 synchronizer.receiveMessage(); // signal to finish 95 96 logWriter.println 97 ("--> SuspendDebuggee: Send signal to all threads to finish and wait..."); 98 allThreadsToFinish = true; 99 100 for (int i=0; i < createdThreadsNumber; i++) { 101 while ( suspendDebuggeeThreads[i].isAlive() ) { 102 waitMlsecsTime(10); 103 } 104 } 105 logWriter.println 106 ("--> SuspendDebuggee: All threads finished!"); 107 108 logWriter.println("--> SuspendDebuggee: FINISH..."); 109 110 } 111 112 public static void main(String [] args) { 113 runDebuggee(SuspendDebuggee.class); 114 } 115 116} 117 118class SuspendDebuggee_Thread extends Thread { 119 120 int threadKind; 121 122 public SuspendDebuggee_Thread(int threadNumber) { 123 super(SuspendDebuggee.THREAD_NAME_PATTERN + threadNumber); 124 threadKind = threadNumber % 3; 125 } 126 127 public void run() { 128 SuspendDebuggee parent = SuspendDebuggee.suspendDebuggeeThis; 129 synchronized (parent) { 130 SuspendDebuggee.startedThreadsNumber++; 131 } 132 while ( ! SuspendDebuggee.allThreadsToFinish ) { 133 switch ( threadKind ) { 134 case 0: 135 SuspendDebuggee.waitMlsecsTime(100); 136 break; 137 case 1: 138 SuspendDebuggee.sleepMlsecsTime(100); 139 } 140 } 141 } 142} 143 144 145