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