Main.java revision 1c83cbc4a817acbd7f9abb5b29a2d418a958e6a1
17c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom/*
27c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom * Copyright (C) 2011 The Android Open Source Project
37c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom *
47c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom * Licensed under the Apache License, Version 2.0 (the "License");
57c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom * you may not use this file except in compliance with the License.
67c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom * You may obtain a copy of the License at
77c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom *
87c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom *      http://www.apache.org/licenses/LICENSE-2.0
97c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom *
107c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom * Unless required by applicable law or agreed to in writing, software
117c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom * distributed under the License is distributed on an "AS IS" BASIS,
127c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom * See the License for the specific language governing permissions and
147c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom * limitations under the License.
157c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom */
167c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
171c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampeimport java.lang.reflect.*;
187c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstromimport java.util.ArrayList;
197c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstromimport java.util.Arrays;
207c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstromimport java.util.Collections;
217c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstromimport java.util.HashMap;
227c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstromimport java.util.List;
237c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstromimport java.util.Map;
247c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
257c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom// Run on host with:
267c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom//   javac ThreadTest.java && java ThreadStress && rm *.class
271c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampepublic class Main implements Runnable {
287c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
294514d3c0e69a49f5dbe19138330a2bb2aee36d63Brian Carlstrom    public static final boolean DEBUG = false;
307c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
317c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom    enum Operation {
327c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        OOM(1),
33831afe4c2334f3d96df39538023f122101c89384Elliott Hughes        SIGQUIT(19),
34cd74c4b3a6893c876c6e03fd99a1264249653d80Brian Carlstrom        ALLOC(60),
35cd74c4b3a6893c876c6e03fd99a1264249653d80Brian Carlstrom        STACKTRACE(20),
367c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        EXIT(50),
374cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes
384cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes        SLEEP(25),
394cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes        TIMED_WAIT(10),
404cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes        WAIT(15);
417c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
427c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        private final int frequency;
437c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        Operation(int frequency) {
447c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            this.frequency = frequency;
457c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        }
467c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom    }
477c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
487c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom    public static void main(String[] args) throws Exception {
497c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
507c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        final int numberOfThreads = 5;
517c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        final int totalOperations = 1000;
527c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        final int operationsPerThread = totalOperations/numberOfThreads;
537c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
544cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes        // Lock used to notify threads performing Operation.WAIT
557c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        final Object lock = new Object();
567c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
577c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // Each thread is going to do operationsPerThread
587c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // operations. The distribution of operations is determined by
597c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // the Operation.frequency values. We fill out an Operation[]
607c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // for each thread with the operations it is to perform. The
617c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // Operation[] is shuffled so that there is more random
627c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // interactions between the threads.
637c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
647c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // The simple-minded filling in of Operation[] based on
657c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // Operation.frequency below won't have even have close to a
667c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // reasonable distribution if the count of Operation
677c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // frequencies is greater than the total number of
687c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // operations. So here we do a quick sanity check in case
697c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // people tweak the constants above.
707c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        int operationCount = 0;
717c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        for (Operation op : Operation.values()) {
727c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            operationCount += op.frequency;
737c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        }
747c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        if (operationCount > operationsPerThread) {
757c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            throw new AssertionError(operationCount + " > " + operationsPerThread);
767c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        }
777c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
787c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // Fill in the Operation[] array for each thread by laying
797c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // down references to operation according to their desired
807c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // frequency.
811c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe        final Main[] threadStresses = new Main[numberOfThreads];
827c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        for (int t = 0; t < threadStresses.length; t++) {
837c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            Operation[] operations = new Operation[operationsPerThread];
847c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            int o = 0;
857c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            LOOP:
867c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            while (true) {
877c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                for (Operation op : Operation.values()) {
887c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    for (int f = 0; f < op.frequency; f++) {
897c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        if (o == operations.length) {
907c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                            break LOOP;
917c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        }
927c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        operations[o] = op;
937c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        o++;
947c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    }
957c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                }
967c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            }
977c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            // Randomize the oepration order
987c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            Collections.shuffle(Arrays.asList(operations));
991c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe            threadStresses[t] = new Main(lock, t, operations);
1007c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        }
1017c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
1027c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // Enable to dump operation counds per thread to make sure its
1037c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // sane compared to Operation.frequency
1047c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        if (DEBUG) {
1057c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            for (int t = 0; t < threadStresses.length; t++) {
1067c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                Operation[] operations = new Operation[operationsPerThread];
1077c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                Map<Operation, Integer> distribution = new HashMap<Operation, Integer>();
1087c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                for (Operation operation : operations) {
1097c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    Integer ops = distribution.get(operation);
1107c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    if (ops == null) {
1117c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        ops = 1;
1127c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    } else {
1137c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        ops++;
1147c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    }
1157c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    distribution.put(operation, ops);
1167c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                }
1177c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                System.out.println("Distribution for " + t);
1187c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                for (Operation op : Operation.values()) {
1197c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    System.out.println(op + " = " + distribution.get(op));
1207c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                }
1217c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            }
1227c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        }
1237c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
1247c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // Create the runners for each thread. The runner Thread
1257c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // ensures that thread that exit due to Operation.EXIT will be
1267c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // restarted until they reach their desired
1277c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // operationsPerThread.
1287c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        Thread[] runners = new Thread[numberOfThreads];
1297c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        for (int r = 0; r < runners.length; r++) {
1301c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe            final Main ts = threadStresses[r];
1315f51d4b80058236759fea1d932470a57f348c199Mathieu Chartier            runners[r] = new Thread("Runner thread " + r) {
1321c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe                final Main threadStress = ts;
1337c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                public void run() {
1347c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    int id = threadStress.id;
1355f51d4b80058236759fea1d932470a57f348c199Mathieu Chartier                    System.out.println("Starting worker for " + id);
1367c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    while (threadStress.nextOperation < operationsPerThread) {
1375f51d4b80058236759fea1d932470a57f348c199Mathieu Chartier                        Thread thread = new Thread(ts, "Worker thread " + id);
1387c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        thread.start();
1397c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        try {
1407c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                            thread.join();
1417c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        } catch (InterruptedException e) {
1427c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        }
1437c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        System.out.println("Thread exited for " + id + " with "
1447c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                                           + (operationsPerThread - threadStress.nextOperation)
1457c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                                           + " operations remaining.");
1467c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    }
1471c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe                    System.out.println("Finishing worker");
1487c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                }
1497c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            };
1507c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        }
1517c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
1527c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // The notifier thread is a daemon just loops forever to wake
1537c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // up threads in Operation.WAIT
1545f51d4b80058236759fea1d932470a57f348c199Mathieu Chartier        Thread notifier = new Thread("Notifier") {
1557c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            public void run() {
1567c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                while (true) {
1577c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    synchronized (lock) {
1587c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        lock.notifyAll();
1597c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    }
1607c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                }
1617c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            }
1627c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        };
1637c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        notifier.setDaemon(true);
1647c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        notifier.start();
1657c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
1667c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        for (int r = 0; r < runners.length; r++) {
1677c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            runners[r].start();
1687c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        }
1697c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        for (int r = 0; r < runners.length; r++) {
1707c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            runners[r].join();
1717c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        }
1727c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom    }
1737c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
1747c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom    private final Operation[] operations;
1757c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom    private final Object lock;
1767c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom    private final int id;
1777c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
1787c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom    private int nextOperation;
1797c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
1801c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe    private Main(Object lock, int id, Operation[] operations) {
1817c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        this.lock = lock;
1827c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        this.id = id;
1837c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        this.operations = operations;
1847c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom    }
1857c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
1867c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom    public void run() {
1877c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        try {
1887c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            if (DEBUG) {
1897c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                System.out.println("Starting ThreadStress " + id);
1907c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            }
1917c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            while (nextOperation < operations.length) {
1927c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                Operation operation = operations[nextOperation];
1937c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                if (DEBUG) {
1947c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    System.out.println("ThreadStress " + id
1957c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                                       + " operation " + nextOperation
1967c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                                       + " is " + operation);
1977c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                }
1987c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                nextOperation++;
1997c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                switch (operation) {
2007c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    case EXIT: {
2017c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        return;
2027c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    }
203831afe4c2334f3d96df39538023f122101c89384Elliott Hughes                    case SIGQUIT: {
204831afe4c2334f3d96df39538023f122101c89384Elliott Hughes                        try {
2051c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe                            SIGQUIT();
2061c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe                        } catch (Exception ex) {
207831afe4c2334f3d96df39538023f122101c89384Elliott Hughes                        }
208831afe4c2334f3d96df39538023f122101c89384Elliott Hughes                    }
2094cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes                    case SLEEP: {
2104cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes                        try {
2114cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes                            Thread.sleep(100);
2124cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes                        } catch (InterruptedException ignored) {
2134cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes                        }
2144cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes                    }
2154cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes                    case TIMED_WAIT: {
2164cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes                        synchronized (lock) {
2174cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes                            try {
2184cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes                                lock.wait(100, 0);
2194cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes                            } catch (InterruptedException ignored) {
2204cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes                            }
2214cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes                        }
2224cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes                        break;
2234cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes                    }
2247c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    case WAIT: {
2257c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        synchronized (lock) {
2267c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                            try {
2277c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                                lock.wait();
2284cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes                            } catch (InterruptedException ignored) {
2297c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                            }
2307c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        }
2317c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        break;
2327c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    }
2337c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    case OOM: {
2347c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        try {
2357c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                            List<byte[]> l = new ArrayList<byte[]>();
2367c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                            while (true) {
2377c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                                l.add(new byte[1024]);
2387c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                            }
2397c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        } catch (OutOfMemoryError e) {
2407c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        }
2417c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        break;
2427c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    }
2437c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    case ALLOC: {
2444514d3c0e69a49f5dbe19138330a2bb2aee36d63Brian Carlstrom                        try {
2454514d3c0e69a49f5dbe19138330a2bb2aee36d63Brian Carlstrom                            List<byte[]> l = new ArrayList<byte[]>();
2464514d3c0e69a49f5dbe19138330a2bb2aee36d63Brian Carlstrom                            for (int i = 0; i < 1024; i++) {
2474514d3c0e69a49f5dbe19138330a2bb2aee36d63Brian Carlstrom                                l.add(new byte[1024]);
2484514d3c0e69a49f5dbe19138330a2bb2aee36d63Brian Carlstrom                            }
2494514d3c0e69a49f5dbe19138330a2bb2aee36d63Brian Carlstrom                        } catch (OutOfMemoryError e) {
2507c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        }
2517c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        break;
2527c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    }
253cd74c4b3a6893c876c6e03fd99a1264249653d80Brian Carlstrom                    case STACKTRACE: {
254cd74c4b3a6893c876c6e03fd99a1264249653d80Brian Carlstrom                        Thread.currentThread().getStackTrace();
255cd74c4b3a6893c876c6e03fd99a1264249653d80Brian Carlstrom                        break;
256cd74c4b3a6893c876c6e03fd99a1264249653d80Brian Carlstrom                    }
2577c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    default: {
2587c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        throw new AssertionError(operation.toString());
2597c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    }
2607c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                }
2617c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            }
2624514d3c0e69a49f5dbe19138330a2bb2aee36d63Brian Carlstrom        } finally {
2637c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            if (DEBUG) {
2647c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                System.out.println("Finishing ThreadStress for " + id);
2657c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            }
2667c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        }
2677c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom    }
2681c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe
2691c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe    private static void SIGQUIT() throws Exception {
2701c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe        Class<?> osClass = Class.forName("android.system.Os");
2711c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe        Method getpid = osClass.getDeclaredMethod("getpid");
2721c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe        int pid = (Integer)getpid.invoke(null);
2731c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe
2741c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe        Class<?> osConstants = Class.forName("android.system.OsConstants");
2751c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe        Field sigquitField = osConstants.getDeclaredField("SIGQUIT");
2761c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe        int sigquit = (Integer)sigquitField.get(null);
2771c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe
2781c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe        Method kill = osClass.getDeclaredMethod("kill", int.class, int.class);
2791c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe        kill.invoke(null, pid, sigquit);
2801c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe    }
2817c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom}
282