15d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao/*
25d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Copyright (C) 2010 The Android Open Source Project
35d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao *
45d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Licensed under the Apache License, Version 2.0 (the "License");
55d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * you may not use this file except in compliance with the License.
65d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * You may obtain a copy of the License at
75d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao *
85d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao *      http://www.apache.org/licenses/LICENSE-2.0
95d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao *
105d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Unless required by applicable law or agreed to in writing, software
115d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * distributed under the License is distributed on an "AS IS" BASIS,
125d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * See the License for the specific language governing permissions and
145d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * limitations under the License.
155d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao */
165d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
175d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
185d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao/*
195d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Entry point and tests that are expected to succeed.
205d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao */
215d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaopublic class Main {
225d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    /**
235d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     * Drives tests.
245d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     */
255d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public static void main(String[] args) {
265d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        Main m = new Main();
275d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
285d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        m.recursiveSync(0);
295d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
305d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        m.nestedMayThrow(false);
315d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        try {
325d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            m.nestedMayThrow(true);
335d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.err.println("nestedThrow(true) did not throw");
345d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        } catch (MyException me) {}
355d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        System.out.println("nestedMayThrow ok");
365d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
375d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        m.constantLock();
385d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        System.out.println("constantLock ok");
395d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
405d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        m.notExcessiveNesting();
415d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        try {
425d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            TooDeep.excessiveNesting();
435d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.err.println("excessiveNesting did not throw");
445d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        } catch (VerifyError ve) {}
455d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        System.out.println("excessiveNesting ok");
465d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
475d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        m.notNested();
485d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        System.out.println("notNested ok");
495d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
505d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        Object obj1 = new Object();
515d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        Object obj2 = new Object();
525d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
535d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        m.twoPath(obj1, obj2, 0);
545d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        System.out.println("twoPath ok");
555d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
565d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        m.triplet(obj1, obj2, 0);
575d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        System.out.println("triplet ok");
585d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
595d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
605d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    /**
615d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     * Recursive synchronized method.
625d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     */
635d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    synchronized void recursiveSync(int iter) {
645d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        if (iter < 40) {
655d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            recursiveSync(iter+1);
665d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        } else {
675d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("recursiveSync ok");
685d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }
695d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
705d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
715d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    /**
725d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     * Tests simple nesting, with and without a throw.
735d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     */
745d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    void nestedMayThrow(boolean doThrow) {
755d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {
765d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            synchronized (Main.class) {
775d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                synchronized (new Object()) {
785d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                    synchronized(Class.class) {
795d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                        if (doThrow) {
805d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                            throw new MyException();
815d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                        }
825d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                    }
835d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                }
845d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            }
855d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }
865d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
875d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
885d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    /**
895d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     * Exercises bug 3215458.
905d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     */
915d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    void constantLock() {
925d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        Class thing = Thread.class;
935d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (Thread.class) {}
945d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
955d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
965d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    /**
975d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     * Confirms that we can have 32 nested monitors on one method.
985d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     */
995d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    void notExcessiveNesting() {
1005d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 1
1015d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 2
1025d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 3
1035d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 4
1045d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 5
1055d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 6
1065d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 7
1075d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 8
1085d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 9
1095d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 10
1105d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 11
1115d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 12
1125d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 13
1135d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 14
1145d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 15
1155d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 16
1165d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 17
1175d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 18
1185d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 19
1195d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 20
1205d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 21
1215d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 22
1225d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 23
1235d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 24
1245d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 25
1255d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 26
1265d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 27
1275d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 28
1285d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 29
1295d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 30
1305d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 31
1315d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {   // 32
1325d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
1335d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
1345d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1355d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    /**
1365d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     * Confirms that we can have more than 32 non-nested monitors in one
1375d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     * method.
1385d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     */
1395d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    void notNested() {
1405d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 1
1415d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 2
1425d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 3
1435d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 4
1445d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 5
1455d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 6
1465d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 7
1475d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 8
1485d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 9
1495d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 10
1505d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 11
1515d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 12
1525d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 13
1535d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 14
1545d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 15
1555d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 16
1565d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 17
1575d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 18
1585d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 19
1595d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 20
1605d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 21
1615d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 22
1625d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 23
1635d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 24
1645d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 25
1655d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 26
1665d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 27
1675d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 28
1685d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 29
1695d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 30
1705d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 31
1715d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 32
1725d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 33
1735d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (this) {}  // 34
1745d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
1755d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1765d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    /* does nothing but ensure that the compiler doesn't discard an object */
1775d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    private void doNothing(Object obj) {}
1785d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1795d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    /**
1805d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     * Conditionally uses one of the synchronized objects.
1815d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     */
1825d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public void twoPath(Object obj1, Object obj2, int x) {
1835d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        Object localObj;
1845d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1855d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (obj1) {
1865d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            synchronized(obj2) {
1875d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                if (x == 0) {
1885d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                    localObj = obj2;
1895d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                } else {
1905d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                    localObj = obj1;
1915d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                }
1925d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            }
1935d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }
1945d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1955d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        doNothing(localObj);
1965d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
1975d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1985d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    /**
1995d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     * Lock the monitor two or three times, and make use of the locked or
2005d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     * unlocked object.
2015d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     */
2025d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public void triplet(Object obj1, Object obj2, int x) {
2035d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        Object localObj;
2045d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
2055d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        synchronized (obj1) {
2065d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            synchronized(obj1) {
2075d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                if (x == 0) {
2085d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                    synchronized(obj1) {
2095d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                        localObj = obj2;
2105d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                    }
2115d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                } else {
2125d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                    localObj = obj1;
2135d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                }
2145d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            }
2155d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }
2165d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
2175d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        doNothing(localObj);
2185d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
2195d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao}
220