Home | History | Annotate | Download | only in ThreadReference
      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 19.06.2006
     25  */
     26 
     27 package org.apache.harmony.jpda.tests.jdwp.ThreadReference;
     28 
     29 import org.apache.harmony.jpda.tests.share.JPDADebuggeeSynchronizer;
     30 import org.apache.harmony.jpda.tests.share.SyncDebuggee;
     31 
     32 public class ThreadGroup002Debuggee extends SyncDebuggee {
     33     public static final int THREAD_NUMBER_LIMIT = 6;
     34     public static final String THREAD_NAME_PATTERN = "ThreadGroup002Debuggee_Thread_";
     35     public static final String THREAD_GROUP_NAME_PATTERN = "ThreadGroup002Debuggee_Thread_Group_";
     36 
     37     static ThreadGroup002Debuggee ThreadGroup002DebuggeeThis;
     38 
     39     static volatile boolean allThreadsToFinish = false;
     40     static int createdThreadsNumber = 0;
     41     static volatile int startedThreadsNumber = 0;
     42 
     43     static int firstThreadsNumber = 0;
     44 
     45     static ThreadGroup002Debuggee_Thread[] ThreadGroup002DebuggeeThreads = null;
     46     static ThreadGroup[] ThreadGroup002DebuggeeThreadGroups = new ThreadGroup[2];
     47 
     48     static Object waitTimeObject = new Object();
     49     static void waitMlsecsTime(long mlsecsTime) {
     50         synchronized(waitTimeObject) {
     51             try {
     52                 waitTimeObject.wait(mlsecsTime);
     53             } catch (Throwable throwable) {
     54                  // ignore
     55             }
     56         }
     57     }
     58 
     59     static void sleepMlsecsTime(long mlsecsTime) {
     60         try {
     61             Thread.sleep(mlsecsTime);
     62         } catch (Throwable throwable) {
     63              // ignore
     64         }
     65     }
     66 
     67     @Override
     68     public void run() {
     69 
     70         logWriter.println("--> ThreadGroup002Debuggee: START...");
     71         ThreadGroup002DebuggeeThis = this;
     72         logWriter.println("--> ThreadGroup002Debuggee: Create thread groups...");
     73         ThreadGroup002DebuggeeThreadGroups[0] =
     74             new ThreadGroup(THREAD_GROUP_NAME_PATTERN + 0);
     75         ThreadGroup002DebuggeeThreadGroups[1] =
     76             new ThreadGroup(THREAD_GROUP_NAME_PATTERN + 1);
     77 
     78         logWriter.println("--> ThreadGroup002Debuggee: Create and start tested threads...");
     79         try {
     80             ThreadGroup002DebuggeeThreads = new ThreadGroup002Debuggee_Thread[THREAD_NUMBER_LIMIT];
     81             for (int i=0; i < THREAD_NUMBER_LIMIT; i++) {
     82                 ThreadGroup002DebuggeeThreads[i] =
     83                     new ThreadGroup002Debuggee_Thread(ThreadGroup002DebuggeeThreadGroups[i%2], i);
     84                 ThreadGroup002DebuggeeThreads[i].start();
     85                 createdThreadsNumber++;
     86             }
     87         } catch ( Throwable thrown) {
     88             logWriter.println
     89             ("--> ThreadGroup002Debuggee: Exception while creating threads: " + thrown);
     90         }
     91         logWriter.println
     92         ("--> ThreadGroup002Debuggee: Created threads number = " + createdThreadsNumber);
     93 
     94         while ( startedThreadsNumber != createdThreadsNumber ) {
     95             waitMlsecsTime(100);
     96         }
     97         if ( createdThreadsNumber != 0 ) {
     98             logWriter.println("--> ThreadGroup002Debuggee: All created threads are started!");
     99         }
    100 
    101         synchronizer.sendMessage(Integer.toString(createdThreadsNumber));
    102 
    103         String mainThreadName = Thread.currentThread().getName();
    104         synchronizer.sendMessage(mainThreadName);
    105 
    106         String mainThreadGroupName = Thread.currentThread().getThreadGroup().getName();
    107         synchronizer.sendMessage(mainThreadGroupName);
    108 
    109 
    110         logWriter.println("--> ThreadGroup002Debuggee: Wait for signal from test to continue...");
    111         String messageFromTest = synchronizer.receiveMessage();  // signal to continue or to finish
    112 
    113         if ( ! messageFromTest.equals("FINISH") ) {
    114             logWriter.println
    115             ("--> ThreadGroup002Debuggee: Send signal to the first threads to finish...");
    116 
    117             firstThreadsNumber = createdThreadsNumber/2;
    118             for (int i=0; i < firstThreadsNumber; i++) {
    119                 while ( ThreadGroup002DebuggeeThreads[i].isAlive() ) {
    120                     waitMlsecsTime(10);
    121                 }
    122             }
    123             logWriter.println
    124             ("--> ThreadGroup002Debuggee: First threads finished - number of finished threads = " +
    125                     firstThreadsNumber);
    126 
    127             synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_READY);
    128 
    129             logWriter.println("--> ThreadGroup002Debuggee: Wait for signal from test to finish...");
    130             synchronizer.receiveMessage();  // signal to finish
    131         }
    132 
    133         logWriter.println
    134         ("--> ThreadGroup002Debuggee: Send signal to all threads to finish and wait...");
    135         allThreadsToFinish = true;
    136 
    137         for (int i=0; i < createdThreadsNumber; i++) {
    138             while ( ThreadGroup002DebuggeeThreads[i].isAlive() ) {
    139                 waitMlsecsTime(10);
    140             }
    141         }
    142         logWriter.println
    143         ("--> ThreadGroup002Debuggee: All threads finished!");
    144 
    145         logWriter.println("--> ThreadGroup002Debuggee: FINISH...");
    146 
    147     }
    148 
    149     public static void main(String [] args) {
    150         runDebuggee(ThreadGroup002Debuggee.class);
    151     }
    152 
    153 }
    154 
    155 class ThreadGroup002Debuggee_Thread extends Thread {
    156 
    157     int threadNumber;
    158     int threadKind;
    159 
    160     public ThreadGroup002Debuggee_Thread(ThreadGroup group, int threadNumber) {
    161         super(group, ThreadGroup002Debuggee.THREAD_NAME_PATTERN + threadNumber);
    162         this.threadNumber = threadNumber;
    163         threadKind = threadNumber % 3;
    164     }
    165 
    166     @Override
    167     public void run() {
    168         ThreadGroup002Debuggee parent = ThreadGroup002Debuggee.ThreadGroup002DebuggeeThis;
    169         synchronized (parent) {
    170             ThreadGroup002Debuggee.startedThreadsNumber++;
    171         }
    172         while ( ! ThreadGroup002Debuggee.allThreadsToFinish ) {
    173             switch ( threadKind ) {
    174             case 0:
    175                 ThreadGroup002Debuggee.waitMlsecsTime(100);
    176                 break;
    177             case 1:
    178                 ThreadGroup002Debuggee.sleepMlsecsTime(100);
    179             }
    180             if (threadNumber < ThreadGroup002Debuggee.firstThreadsNumber ) {
    181                 return;
    182             }
    183         }
    184     }
    185 }
    186 
    187 
    188