Main.java revision 4514d3c0e69a49f5dbe19138330a2bb2aee36d63
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
177c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstromimport java.util.ArrayList;
187c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstromimport java.util.Arrays;
197c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstromimport java.util.Collections;
207c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstromimport java.util.HashMap;
217c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstromimport java.util.List;
227c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstromimport java.util.Map;
237c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
247c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom// Run on host with:
257c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom//   javac ThreadTest.java && java ThreadStress && rm *.class
267c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstromclass ThreadStress implements Runnable {
277c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
284514d3c0e69a49f5dbe19138330a2bb2aee36d63Brian Carlstrom    public static final boolean DEBUG = false;
297c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
307c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom    enum Operation {
317c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        OOM(1),
327c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        ALLOC(99),
337c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        EXIT(50),
347c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        WAIT(50);
357c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
367c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        private final int frequency;
377c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        Operation(int frequency) {
387c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            this.frequency = frequency;
397c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        }
407c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom    }
417c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
427c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom    public static void main(String[] args) throws Exception {
437c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
447c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        final int numberOfThreads = 5;
457c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        final int totalOperations = 1000;
467c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        final int operationsPerThread = totalOperations/numberOfThreads;
477c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
487c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // Lock used to notify threads performin Operation.WAIT
497c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        final Object lock = new Object();
507c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
517c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // Each thread is going to do operationsPerThread
527c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // operations. The distribution of operations is determined by
537c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // the Operation.frequency values. We fill out an Operation[]
547c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // for each thread with the operations it is to perform. The
557c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // Operation[] is shuffled so that there is more random
567c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // interactions between the threads.
577c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
587c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // The simple-minded filling in of Operation[] based on
597c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // Operation.frequency below won't have even have close to a
607c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // reasonable distribution if the count of Operation
617c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // frequencies is greater than the total number of
627c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // operations. So here we do a quick sanity check in case
637c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // people tweak the constants above.
647c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        int operationCount = 0;
657c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        for (Operation op : Operation.values()) {
667c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            operationCount += op.frequency;
677c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        }
687c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        if (operationCount > operationsPerThread) {
697c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            throw new AssertionError(operationCount + " > " + operationsPerThread);
707c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        }
717c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
727c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // Fill in the Operation[] array for each thread by laying
737c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // down references to operation according to their desired
747c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // frequency.
757c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        final ThreadStress[] threadStresses = new ThreadStress[numberOfThreads];
767c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        for (int t = 0; t < threadStresses.length; t++) {
777c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            Operation[] operations = new Operation[operationsPerThread];
787c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            int o = 0;
797c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            LOOP:
807c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            while (true) {
817c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                for (Operation op : Operation.values()) {
827c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    for (int f = 0; f < op.frequency; f++) {
837c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        if (o == operations.length) {
847c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                            break LOOP;
857c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        }
867c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        operations[o] = op;
877c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        o++;
887c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    }
897c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                }
907c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            }
917c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            // Randomize the oepration order
927c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            Collections.shuffle(Arrays.asList(operations));
937c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            threadStresses[t] = new ThreadStress(lock, t, operations);
947c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        }
957c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
967c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // Enable to dump operation counds per thread to make sure its
977c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // sane compared to Operation.frequency
987c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        if (DEBUG) {
997c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            for (int t = 0; t < threadStresses.length; t++) {
1007c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                Operation[] operations = new Operation[operationsPerThread];
1017c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                Map<Operation, Integer> distribution = new HashMap<Operation, Integer>();
1027c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                for (Operation operation : operations) {
1037c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    Integer ops = distribution.get(operation);
1047c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    if (ops == null) {
1057c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        ops = 1;
1067c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    } else {
1077c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        ops++;
1087c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    }
1097c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    distribution.put(operation, ops);
1107c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                }
1117c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                System.out.println("Distribution for " + t);
1127c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                for (Operation op : Operation.values()) {
1137c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    System.out.println(op + " = " + distribution.get(op));
1147c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                }
1157c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            }
1167c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        }
1177c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
1187c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // Create the runners for each thread. The runner Thread
1197c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // ensures that thread that exit due to Operation.EXIT will be
1207c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // restarted until they reach their desired
1217c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // operationsPerThread.
1227c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        Thread[] runners = new Thread[numberOfThreads];
1237c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        for (int r = 0; r < runners.length; r++) {
1247c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            final ThreadStress ts = threadStresses[r];
1257c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            runners[r] = new Thread() {
1267c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                final ThreadStress threadStress = ts;
1277c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                public void run() {
1287c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    int id = threadStress.id;
1297c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    System.out.println("Starting runner for " + id);
1307c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    while (threadStress.nextOperation < operationsPerThread) {
1317c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        Thread thread = new Thread(ts);
1327c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        thread.start();
1337c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        try {
1347c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                            thread.join();
1357c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        } catch (InterruptedException e) {
1367c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        }
1377c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        System.out.println("Thread exited for " + id + " with "
1387c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                                           + (operationsPerThread - threadStress.nextOperation)
1397c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                                           + " operations remaining.");
1407c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    }
1417c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    System.out.println("Finishing runner for " + id);
1427c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                }
1437c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            };
1447c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        }
1457c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
1467c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // The notifier thread is a daemon just loops forever to wake
1477c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        // up threads in Operation.WAIT
1487c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        Thread notifier = new Thread() {
1497c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            public void run() {
1507c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                while (true) {
1517c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    synchronized (lock) {
1527c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        lock.notifyAll();
1537c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    }
1547c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                }
1557c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            }
1567c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        };
1577c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        notifier.setDaemon(true);
1587c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        notifier.start();
1597c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
1607c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        for (int r = 0; r < runners.length; r++) {
1617c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            runners[r].start();
1627c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        }
1637c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        for (int r = 0; r < runners.length; r++) {
1647c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            runners[r].join();
1657c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        }
1667c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom    }
1677c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
1687c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom    private final Operation[] operations;
1697c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom    private final Object lock;
1707c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom    private final int id;
1717c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
1727c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom    private int nextOperation;
1737c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
1747c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom    private ThreadStress(Object lock, int id, Operation[] operations) {
1757c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        this.lock = lock;
1767c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        this.id = id;
1777c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        this.operations = operations;
1787c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom    }
1797c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom
1807c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom    public void run() {
1817c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        try {
1827c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            if (DEBUG) {
1837c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                System.out.println("Starting ThreadStress " + id);
1847c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            }
1857c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            while (nextOperation < operations.length) {
1867c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                Operation operation = operations[nextOperation];
1877c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                if (DEBUG) {
1887c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    System.out.println("ThreadStress " + id
1897c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                                       + " operation " + nextOperation
1907c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                                       + " is " + operation);
1917c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                }
1927c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                nextOperation++;
1937c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                switch (operation) {
1947c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    case EXIT: {
1957c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        return;
1967c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    }
1977c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    case WAIT: {
1987c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        synchronized (lock) {
1997c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                            try {
2007c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                                lock.wait();
2017c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                            } catch (InterruptedException e) {
2027c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                            }
2037c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        }
2047c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        break;
2057c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    }
2067c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    case OOM: {
2077c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        try {
2087c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                            List<byte[]> l = new ArrayList<byte[]>();
2097c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                            while (true) {
2107c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                                l.add(new byte[1024]);
2117c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                            }
2127c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        } catch (OutOfMemoryError e) {
2137c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        }
2147c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        break;
2157c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    }
2167c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    case ALLOC: {
2174514d3c0e69a49f5dbe19138330a2bb2aee36d63Brian Carlstrom                        try {
2184514d3c0e69a49f5dbe19138330a2bb2aee36d63Brian Carlstrom                            List<byte[]> l = new ArrayList<byte[]>();
2194514d3c0e69a49f5dbe19138330a2bb2aee36d63Brian Carlstrom                            for (int i = 0; i < 1024; i++) {
2204514d3c0e69a49f5dbe19138330a2bb2aee36d63Brian Carlstrom                                l.add(new byte[1024]);
2214514d3c0e69a49f5dbe19138330a2bb2aee36d63Brian Carlstrom                            }
2224514d3c0e69a49f5dbe19138330a2bb2aee36d63Brian Carlstrom                        } catch (OutOfMemoryError e) {
2237c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        }
2247c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        break;
2257c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    }
2267c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    default: {
2277c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                        throw new AssertionError(operation.toString());
2287c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                    }
2297c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                }
2307c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            }
2314514d3c0e69a49f5dbe19138330a2bb2aee36d63Brian Carlstrom        } finally {
2327c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            if (DEBUG) {
2337c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom                System.out.println("Finishing ThreadStress for " + id);
2347c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom            }
2357c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom        }
2367c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom    }
2377c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom}
238