13f64a024dec2c080b9abde74502826b29263152aAndy McFadden/*
23f64a024dec2c080b9abde74502826b29263152aAndy McFadden * Copyright (C) 2010 The Android Open Source Project
33f64a024dec2c080b9abde74502826b29263152aAndy McFadden *
43f64a024dec2c080b9abde74502826b29263152aAndy McFadden * Licensed under the Apache License, Version 2.0 (the "License");
53f64a024dec2c080b9abde74502826b29263152aAndy McFadden * you may not use this file except in compliance with the License.
63f64a024dec2c080b9abde74502826b29263152aAndy McFadden * You may obtain a copy of the License at
73f64a024dec2c080b9abde74502826b29263152aAndy McFadden *
83f64a024dec2c080b9abde74502826b29263152aAndy McFadden *      http://www.apache.org/licenses/LICENSE-2.0
93f64a024dec2c080b9abde74502826b29263152aAndy McFadden *
103f64a024dec2c080b9abde74502826b29263152aAndy McFadden * Unless required by applicable law or agreed to in writing, software
113f64a024dec2c080b9abde74502826b29263152aAndy McFadden * distributed under the License is distributed on an "AS IS" BASIS,
123f64a024dec2c080b9abde74502826b29263152aAndy McFadden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133f64a024dec2c080b9abde74502826b29263152aAndy McFadden * See the License for the specific language governing permissions and
143f64a024dec2c080b9abde74502826b29263152aAndy McFadden * limitations under the License.
153f64a024dec2c080b9abde74502826b29263152aAndy McFadden */
163f64a024dec2c080b9abde74502826b29263152aAndy McFadden
173f64a024dec2c080b9abde74502826b29263152aAndy McFadden
183f64a024dec2c080b9abde74502826b29263152aAndy McFadden/*
193f64a024dec2c080b9abde74502826b29263152aAndy McFadden * Entry point and tests that are expected to succeed.
203f64a024dec2c080b9abde74502826b29263152aAndy McFadden */
213f64a024dec2c080b9abde74502826b29263152aAndy McFaddenpublic class Main {
223f64a024dec2c080b9abde74502826b29263152aAndy McFadden    /**
233f64a024dec2c080b9abde74502826b29263152aAndy McFadden     * Drives tests.
243f64a024dec2c080b9abde74502826b29263152aAndy McFadden     */
253f64a024dec2c080b9abde74502826b29263152aAndy McFadden    public static void main(String[] args) {
263f64a024dec2c080b9abde74502826b29263152aAndy McFadden        Main m = new Main();
273f64a024dec2c080b9abde74502826b29263152aAndy McFadden
283f64a024dec2c080b9abde74502826b29263152aAndy McFadden        m.recursiveSync(0);
293f64a024dec2c080b9abde74502826b29263152aAndy McFadden
303f64a024dec2c080b9abde74502826b29263152aAndy McFadden        m.nestedMayThrow(false);
313f64a024dec2c080b9abde74502826b29263152aAndy McFadden        try {
323f64a024dec2c080b9abde74502826b29263152aAndy McFadden            m.nestedMayThrow(true);
333f64a024dec2c080b9abde74502826b29263152aAndy McFadden            System.err.println("nestedThrow(true) did not throw");
343f64a024dec2c080b9abde74502826b29263152aAndy McFadden        } catch (MyException me) {}
353f64a024dec2c080b9abde74502826b29263152aAndy McFadden        System.out.println("nestedMayThrow ok");
363f64a024dec2c080b9abde74502826b29263152aAndy McFadden
373f64a024dec2c080b9abde74502826b29263152aAndy McFadden        m.constantLock();
383f64a024dec2c080b9abde74502826b29263152aAndy McFadden        System.out.println("constantLock ok");
393f64a024dec2c080b9abde74502826b29263152aAndy McFadden
403f64a024dec2c080b9abde74502826b29263152aAndy McFadden        m.notExcessiveNesting();
413f64a024dec2c080b9abde74502826b29263152aAndy McFadden        if (false) {    // TODO: remove when verification is turned on
423f64a024dec2c080b9abde74502826b29263152aAndy McFadden        try {
433f64a024dec2c080b9abde74502826b29263152aAndy McFadden            TooDeep.excessiveNesting();
443f64a024dec2c080b9abde74502826b29263152aAndy McFadden            System.err.println("excessiveNesting did not throw");
453f64a024dec2c080b9abde74502826b29263152aAndy McFadden        } catch (VerifyError ve) {}
463f64a024dec2c080b9abde74502826b29263152aAndy McFadden        }
473f64a024dec2c080b9abde74502826b29263152aAndy McFadden        System.out.println("excessiveNesting ok");
483f64a024dec2c080b9abde74502826b29263152aAndy McFadden
493f64a024dec2c080b9abde74502826b29263152aAndy McFadden        m.notNested();
503f64a024dec2c080b9abde74502826b29263152aAndy McFadden        System.out.println("notNested ok");
513f64a024dec2c080b9abde74502826b29263152aAndy McFadden
523f64a024dec2c080b9abde74502826b29263152aAndy McFadden        Object obj1 = new Object();
533f64a024dec2c080b9abde74502826b29263152aAndy McFadden        Object obj2 = new Object();
543f64a024dec2c080b9abde74502826b29263152aAndy McFadden
553f64a024dec2c080b9abde74502826b29263152aAndy McFadden        m.twoPath(obj1, obj2, 0);
563f64a024dec2c080b9abde74502826b29263152aAndy McFadden        System.out.println("twoPath ok");
573f64a024dec2c080b9abde74502826b29263152aAndy McFadden
583f64a024dec2c080b9abde74502826b29263152aAndy McFadden        m.triplet(obj1, obj2, 0);
593f64a024dec2c080b9abde74502826b29263152aAndy McFadden        System.out.println("triplet ok");
603f64a024dec2c080b9abde74502826b29263152aAndy McFadden    }
613f64a024dec2c080b9abde74502826b29263152aAndy McFadden
623f64a024dec2c080b9abde74502826b29263152aAndy McFadden    /**
633f64a024dec2c080b9abde74502826b29263152aAndy McFadden     * Recursive synchronized method.
643f64a024dec2c080b9abde74502826b29263152aAndy McFadden     */
653f64a024dec2c080b9abde74502826b29263152aAndy McFadden    synchronized void recursiveSync(int iter) {
663f64a024dec2c080b9abde74502826b29263152aAndy McFadden        if (iter < 40) {
673f64a024dec2c080b9abde74502826b29263152aAndy McFadden            recursiveSync(iter+1);
683f64a024dec2c080b9abde74502826b29263152aAndy McFadden        } else {
693f64a024dec2c080b9abde74502826b29263152aAndy McFadden            System.out.println("recursiveSync ok");
703f64a024dec2c080b9abde74502826b29263152aAndy McFadden        }
713f64a024dec2c080b9abde74502826b29263152aAndy McFadden    }
723f64a024dec2c080b9abde74502826b29263152aAndy McFadden
733f64a024dec2c080b9abde74502826b29263152aAndy McFadden    /**
743f64a024dec2c080b9abde74502826b29263152aAndy McFadden     * Tests simple nesting, with and without a throw.
753f64a024dec2c080b9abde74502826b29263152aAndy McFadden     */
763f64a024dec2c080b9abde74502826b29263152aAndy McFadden    void nestedMayThrow(boolean doThrow) {
773f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {
783f64a024dec2c080b9abde74502826b29263152aAndy McFadden            synchronized (Main.class) {
793f64a024dec2c080b9abde74502826b29263152aAndy McFadden                synchronized (new Object()) {
803f64a024dec2c080b9abde74502826b29263152aAndy McFadden                    synchronized(Class.class) {
813f64a024dec2c080b9abde74502826b29263152aAndy McFadden                        if (doThrow) {
823f64a024dec2c080b9abde74502826b29263152aAndy McFadden                            throw new MyException();
833f64a024dec2c080b9abde74502826b29263152aAndy McFadden                        }
843f64a024dec2c080b9abde74502826b29263152aAndy McFadden                    }
853f64a024dec2c080b9abde74502826b29263152aAndy McFadden                }
863f64a024dec2c080b9abde74502826b29263152aAndy McFadden            }
873f64a024dec2c080b9abde74502826b29263152aAndy McFadden        }
883f64a024dec2c080b9abde74502826b29263152aAndy McFadden    }
893f64a024dec2c080b9abde74502826b29263152aAndy McFadden
903f64a024dec2c080b9abde74502826b29263152aAndy McFadden    /**
913f64a024dec2c080b9abde74502826b29263152aAndy McFadden     * Exercises bug 3215458.
923f64a024dec2c080b9abde74502826b29263152aAndy McFadden     */
933f64a024dec2c080b9abde74502826b29263152aAndy McFadden    void constantLock() {
943f64a024dec2c080b9abde74502826b29263152aAndy McFadden        Class thing = Thread.class;
953f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (Thread.class) {}
963f64a024dec2c080b9abde74502826b29263152aAndy McFadden    }
973f64a024dec2c080b9abde74502826b29263152aAndy McFadden
983f64a024dec2c080b9abde74502826b29263152aAndy McFadden    /**
993f64a024dec2c080b9abde74502826b29263152aAndy McFadden     * Confirms that we can have 32 nested monitors on one method.
1003f64a024dec2c080b9abde74502826b29263152aAndy McFadden     */
1013f64a024dec2c080b9abde74502826b29263152aAndy McFadden    void notExcessiveNesting() {
1023f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 1
1033f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 2
1043f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 3
1053f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 4
1063f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 5
1073f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 6
1083f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 7
1093f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 8
1103f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 9
1113f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 10
1123f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 11
1133f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 12
1143f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 13
1153f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 14
1163f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 15
1173f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 16
1183f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 17
1193f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 18
1203f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 19
1213f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 20
1223f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 21
1233f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 22
1243f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 23
1253f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 24
1263f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 25
1273f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 26
1283f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 27
1293f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 28
1303f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 29
1313f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 30
1323f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 31
1333f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {   // 32
1343f64a024dec2c080b9abde74502826b29263152aAndy McFadden        }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
1353f64a024dec2c080b9abde74502826b29263152aAndy McFadden    }
1363f64a024dec2c080b9abde74502826b29263152aAndy McFadden
1373f64a024dec2c080b9abde74502826b29263152aAndy McFadden    /**
1383f64a024dec2c080b9abde74502826b29263152aAndy McFadden     * Confirms that we can have more than 32 non-nested monitors in one
1393f64a024dec2c080b9abde74502826b29263152aAndy McFadden     * method.
1403f64a024dec2c080b9abde74502826b29263152aAndy McFadden     */
1413f64a024dec2c080b9abde74502826b29263152aAndy McFadden    void notNested() {
1423f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 1
1433f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 2
1443f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 3
1453f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 4
1463f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 5
1473f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 6
1483f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 7
1493f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 8
1503f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 9
1513f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 10
1523f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 11
1533f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 12
1543f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 13
1553f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 14
1563f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 15
1573f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 16
1583f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 17
1593f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 18
1603f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 19
1613f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 20
1623f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 21
1633f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 22
1643f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 23
1653f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 24
1663f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 25
1673f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 26
1683f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 27
1693f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 28
1703f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 29
1713f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 30
1723f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 31
1733f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 32
1743f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 33
1753f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (this) {}  // 34
1763f64a024dec2c080b9abde74502826b29263152aAndy McFadden    }
1773f64a024dec2c080b9abde74502826b29263152aAndy McFadden
1783f64a024dec2c080b9abde74502826b29263152aAndy McFadden    /* does nothing but ensure that the compiler doesn't discard an object */
1793f64a024dec2c080b9abde74502826b29263152aAndy McFadden    private void doNothing(Object obj) {}
1803f64a024dec2c080b9abde74502826b29263152aAndy McFadden
1813f64a024dec2c080b9abde74502826b29263152aAndy McFadden    /**
1823f64a024dec2c080b9abde74502826b29263152aAndy McFadden     * Conditionally uses one of the synchronized objects.
1833f64a024dec2c080b9abde74502826b29263152aAndy McFadden     */
1843f64a024dec2c080b9abde74502826b29263152aAndy McFadden    public void twoPath(Object obj1, Object obj2, int x) {
1853f64a024dec2c080b9abde74502826b29263152aAndy McFadden        Object localObj;
1863f64a024dec2c080b9abde74502826b29263152aAndy McFadden
1873f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (obj1) {
1883f64a024dec2c080b9abde74502826b29263152aAndy McFadden            synchronized(obj2) {
1893f64a024dec2c080b9abde74502826b29263152aAndy McFadden                if (x == 0) {
1903f64a024dec2c080b9abde74502826b29263152aAndy McFadden                    localObj = obj2;
1913f64a024dec2c080b9abde74502826b29263152aAndy McFadden                } else {
1923f64a024dec2c080b9abde74502826b29263152aAndy McFadden                    localObj = obj1;
1933f64a024dec2c080b9abde74502826b29263152aAndy McFadden                }
1943f64a024dec2c080b9abde74502826b29263152aAndy McFadden            }
1953f64a024dec2c080b9abde74502826b29263152aAndy McFadden        }
1963f64a024dec2c080b9abde74502826b29263152aAndy McFadden
1973f64a024dec2c080b9abde74502826b29263152aAndy McFadden        doNothing(localObj);
1983f64a024dec2c080b9abde74502826b29263152aAndy McFadden    }
1993f64a024dec2c080b9abde74502826b29263152aAndy McFadden
2003f64a024dec2c080b9abde74502826b29263152aAndy McFadden    /**
2013f64a024dec2c080b9abde74502826b29263152aAndy McFadden     * Lock the monitor two or three times, and make use of the locked or
2023f64a024dec2c080b9abde74502826b29263152aAndy McFadden     * unlocked object.
2033f64a024dec2c080b9abde74502826b29263152aAndy McFadden     */
2043f64a024dec2c080b9abde74502826b29263152aAndy McFadden    public void triplet(Object obj1, Object obj2, int x) {
2053f64a024dec2c080b9abde74502826b29263152aAndy McFadden        Object localObj;
2063f64a024dec2c080b9abde74502826b29263152aAndy McFadden
2073f64a024dec2c080b9abde74502826b29263152aAndy McFadden        synchronized (obj1) {
2083f64a024dec2c080b9abde74502826b29263152aAndy McFadden            synchronized(obj1) {
2093f64a024dec2c080b9abde74502826b29263152aAndy McFadden                if (x == 0) {
2103f64a024dec2c080b9abde74502826b29263152aAndy McFadden                    synchronized(obj1) {
2113f64a024dec2c080b9abde74502826b29263152aAndy McFadden                        localObj = obj2;
2123f64a024dec2c080b9abde74502826b29263152aAndy McFadden                    }
2133f64a024dec2c080b9abde74502826b29263152aAndy McFadden                } else {
2143f64a024dec2c080b9abde74502826b29263152aAndy McFadden                    localObj = obj1;
2153f64a024dec2c080b9abde74502826b29263152aAndy McFadden                }
2163f64a024dec2c080b9abde74502826b29263152aAndy McFadden            }
2173f64a024dec2c080b9abde74502826b29263152aAndy McFadden        }
2183f64a024dec2c080b9abde74502826b29263152aAndy McFadden
2193f64a024dec2c080b9abde74502826b29263152aAndy McFadden        doNothing(localObj);
2203f64a024dec2c080b9abde74502826b29263152aAndy McFadden    }
2213f64a024dec2c080b9abde74502826b29263152aAndy McFadden}
222