TestStackBangMonitorOwned.java revision 11486:3950d1713ffa
1/*
2 * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/*
25 * @test
26 * @bug 8032410
27 * @summary Stack overflow at deoptimization doesn't release owned monitors
28 * @run main/othervm -XX:-BackgroundCompilation -XX:CompileCommand=dontinline,TestStackBangMonitorOwned::m1 -XX:CompileCommand=exclude,TestStackBangMonitorOwned::m2 -Xss512K -XX:-UseOnStackReplacement TestStackBangMonitorOwned
29 *
30 */
31public class TestStackBangMonitorOwned {
32
33    static class UnloadedClass1 {
34        volatile int field;
35    }
36
37    static Object m1(boolean deopt) {
38        long l0, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12,
39        l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23, l24,
40        l25, l26, l27, l28, l29, l30, l31, l32, l33, l34, l35, l36,
41        l37, l38, l39, l40, l41, l42, l43, l44, l45, l46, l47, l48,
42        l49, l50, l51, l52, l53, l54, l55, l56, l57, l58, l59, l60,
43        l61, l62, l63, l64, l65, l66, l67, l68, l69, l70, l71, l72,
44        l73, l74, l75, l76, l77, l78, l79, l80, l81, l82, l83, l84,
45        l85, l86, l87, l88, l89, l90, l91, l92, l93, l94, l95, l96,
46        l97, l98, l99, l100, l101, l102, l103, l104, l105, l106, l107,
47        l108, l109, l110, l111, l112, l113, l114, l115, l116, l117,
48        l118, l119, l120, l121, l122, l123, l124, l125, l126, l127,
49        l128, l129, l130, l131, l132, l133, l134, l135, l136, l137,
50        l138, l139, l140, l141, l142, l143, l144, l145, l146, l147,
51        l148, l149, l150, l151, l152, l153, l154, l155, l156, l157,
52        l158, l159, l160, l161, l162, l163, l164, l165, l166, l167,
53        l168, l169, l170, l171, l172, l173, l174, l175, l176, l177,
54        l178, l179, l180, l181, l182, l183, l184, l185, l186, l187,
55        l188, l189, l190, l191, l192, l193, l194, l195, l196, l197,
56        l198, l199, l200, l201, l202, l203, l204, l205, l206, l207,
57        l208, l209, l210, l211, l212, l213, l214, l215, l216, l217,
58        l218, l219, l220, l221, l222, l223, l224, l225, l226, l227,
59        l228, l229, l230, l231, l232, l233, l234, l235, l236, l237,
60        l238, l239, l240, l241, l242, l243, l244, l245, l246, l247,
61        l248, l249, l250, l251, l252, l253, l254, l255, l256, l257,
62        l258, l259, l260, l261, l262, l263, l264, l265, l266, l267,
63        l268, l269, l270, l271, l272, l273, l274, l275, l276, l277,
64        l278, l279, l280, l281, l282, l283, l284, l285, l286, l287,
65        l288, l289, l290, l291, l292, l293, l294, l295, l296, l297,
66        l298, l299, l300, l301, l302, l303, l304, l305, l306, l307,
67        l308, l309, l310, l311, l312, l313, l314, l315, l316, l317,
68        l318, l319, l320, l321, l322, l323, l324, l325, l326, l327,
69        l328, l329, l330, l331, l332, l333, l334, l335, l336, l337,
70        l338, l339, l340, l341, l342, l343, l344, l345, l346, l347,
71        l348, l349, l350, l351, l352, l353, l354, l355, l356, l357,
72        l358, l359, l360, l361, l362, l363, l364, l365, l366, l367,
73        l368, l369, l370, l371, l372, l373, l374, l375, l376, l377,
74        l378, l379, l380, l381, l382, l383, l384, l385, l386, l387,
75        l388, l389, l390, l391, l392, l393, l394, l395, l396, l397,
76        l398, l399, l400, l401, l402, l403, l404, l405, l406, l407,
77        l408, l409, l410, l411, l412, l413, l414, l415, l416, l417,
78        l418, l419, l420, l421, l422, l423, l424, l425, l426, l427,
79        l428, l429, l430, l431, l432, l433, l434, l435, l436, l437,
80        l438, l439, l440, l441, l442, l443, l444, l445, l446, l447,
81        l448, l449, l450, l451, l452, l453, l454, l455, l456, l457,
82        l458, l459, l460, l461, l462, l463, l464, l465, l466, l467,
83        l468, l469, l470, l471, l472, l473, l474, l475, l476, l477,
84        l478, l479, l480, l481, l482, l483, l484, l485, l486, l487,
85        l488, l489, l490, l491, l492, l493, l494, l495, l496, l497,
86        l498, l499, l500, l501, l502, l503, l504, l505, l506, l507,
87        l508, l509, l510, l511;
88
89        long ll0, ll1, ll2, ll3, ll4, ll5, ll6, ll7, ll8, ll9, ll10, ll11, ll12,
90        ll13, ll14, ll15, ll16, ll17, ll18, ll19, ll20, ll21, ll22, ll23, ll24,
91        ll25, ll26, ll27, ll28, ll29, ll30, ll31, ll32, ll33, ll34, ll35, ll36,
92        ll37, ll38, ll39, ll40, ll41, ll42, ll43, ll44, ll45, ll46, ll47, ll48,
93        ll49, ll50, ll51, ll52, ll53, ll54, ll55, ll56, ll57, ll58, ll59, ll60,
94        ll61, ll62, ll63, ll64, ll65, ll66, ll67, ll68, ll69, ll70, ll71, ll72,
95        ll73, ll74, ll75, ll76, ll77, ll78, ll79, ll80, ll81, ll82, ll83, ll84,
96        ll85, ll86, ll87, ll88, ll89, ll90, ll91, ll92, ll93, ll94, ll95, ll96,
97        ll97, ll98, ll99, ll100, ll101, ll102, ll103, ll104, ll105, ll106, ll107,
98        ll108, ll109, ll110, ll111, ll112, ll113, ll114, ll115, ll116, ll117,
99        ll118, ll119, ll120, ll121, ll122, ll123, ll124, ll125, ll126, ll127,
100        ll128, ll129, ll130, ll131, ll132, ll133, ll134, ll135, ll136, ll137,
101        ll138, ll139, ll140, ll141, ll142, ll143, ll144, ll145, ll146, ll147,
102        ll148, ll149, ll150, ll151, ll152, ll153, ll154, ll155, ll156, ll157,
103        ll158, ll159, ll160, ll161, ll162, ll163, ll164, ll165, ll166, ll167,
104        ll168, ll169, ll170, ll171, ll172, ll173, ll174, ll175, ll176, ll177,
105        ll178, ll179, ll180, ll181, ll182, ll183, ll184, ll185, ll186, ll187,
106        ll188, ll189, ll190, ll191, ll192, ll193, ll194, ll195, ll196, ll197,
107        ll198, ll199, ll200, ll201, ll202, ll203, ll204, ll205, ll206, ll207,
108        ll208, ll209, ll210, ll211, ll212, ll213, ll214, ll215, ll216, ll217,
109        ll218, ll219, ll220, ll221, ll222, ll223, ll224, ll225, ll226, ll227,
110        ll228, ll229, ll230, ll231, ll232, ll233, ll234, ll235, ll236, ll237,
111        ll238, ll239, ll240, ll241, ll242, ll243, ll244, ll245, ll246, ll247,
112        ll248, ll249, ll250, ll251, ll252, ll253, ll254, ll255, ll256, ll257,
113        ll258, ll259, ll260, ll261, ll262, ll263, ll264, ll265, ll266, ll267,
114        ll268, ll269, ll270, ll271, ll272, ll273, ll274, ll275, ll276, ll277,
115        ll278, ll279, ll280, ll281, ll282, ll283, ll284, ll285, ll286, ll287,
116        ll288, ll289, ll290, ll291, ll292, ll293, ll294, ll295, ll296, ll297,
117        ll298, ll299, ll300, ll301, ll302, ll303, ll304, ll305, ll306, ll307,
118        ll308, ll309, ll310, ll311, ll312, ll313, ll314, ll315, ll316, ll317,
119        ll318, ll319, ll320, ll321, ll322, ll323, ll324, ll325, ll326, ll327,
120        ll328, ll329, ll330, ll331, ll332, ll333, ll334, ll335, ll336, ll337,
121        ll338, ll339, ll340, ll341, ll342, ll343, ll344, ll345, ll346, ll347,
122        ll348, ll349, ll350, ll351, ll352, ll353, ll354, ll355, ll356, ll357,
123        ll358, ll359, ll360, ll361, ll362, ll363, ll364, ll365, ll366, ll367,
124        ll368, ll369, ll370, ll371, ll372, ll373, ll374, ll375, ll376, ll377,
125        ll378, ll379, ll380, ll381, ll382, ll383, ll384, ll385, ll386, ll387,
126        ll388, ll389, ll390, ll391, ll392, ll393, ll394, ll395, ll396, ll397,
127        ll398, ll399, ll400, ll401, ll402, ll403, ll404, ll405, ll406, ll407,
128        ll408, ll409, ll410, ll411, ll412, ll413, ll414, ll415, ll416, ll417,
129        ll418, ll419, ll420, ll421, ll422, ll423, ll424, ll425, ll426, ll427,
130        ll428, ll429, ll430, ll431, ll432, ll433, ll434, ll435, ll436, ll437,
131        ll438, ll439, ll440, ll441, ll442, ll443, ll444, ll445, ll446, ll447,
132        ll448, ll449, ll450, ll451, ll452, ll453, ll454, ll455, ll456, ll457,
133        ll458, ll459, ll460, ll461, ll462, ll463, ll464, ll465, ll466, ll467,
134        ll468, ll469, ll470, ll471, ll472, ll473, ll474, ll475, ll476, ll477,
135        ll478, ll479, ll480, ll481, ll482, ll483, ll484, ll485, ll486, ll487,
136        ll488, ll489, ll490, ll491, ll492, ll493, ll494, ll495, ll496, ll497,
137        ll498, ll499, ll500, ll501, ll502, ll503, ll504, ll505, ll506, ll507,
138        ll508, ll509, ll510, ll511;
139
140        if (deopt) {
141            method_entered = true;
142            synchronized(monitor) {
143                do_monitor_acquire = true;
144                UnloadedClass1 res = new UnloadedClass1(); // forces deopt with c2
145                res.field = 0; //forced deopt with c1
146                return res;
147            }
148        }
149        return null;
150    }
151
152    static boolean m2(boolean deopt) {
153        long l0, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12,
154        l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23, l24,
155        l25, l26, l27, l28, l29, l30, l31, l32, l33, l34, l35, l36,
156        l37, l38, l39, l40, l41, l42, l43, l44, l45, l46, l47, l48,
157        l49, l50, l51, l52, l53, l54, l55, l56, l57, l58, l59, l60,
158        l61, l62, l63, l64, l65, l66, l67, l68, l69, l70, l71, l72,
159        l73, l74, l75, l76, l77, l78, l79, l80, l81, l82, l83, l84,
160        l85, l86, l87, l88, l89, l90, l91, l92, l93, l94, l95, l96,
161        l97, l98, l99, l100, l101, l102, l103, l104, l105, l106, l107,
162        l108, l109, l110, l111, l112, l113, l114, l115, l116, l117,
163        l118, l119, l120, l121, l122, l123, l124, l125, l126, l127,
164        l128, l129, l130, l131, l132, l133, l134, l135, l136, l137,
165        l138, l139, l140, l141, l142, l143, l144, l145, l146, l147,
166        l148, l149, l150, l151, l152, l153, l154, l155, l156, l157,
167        l158, l159, l160, l161, l162, l163, l164, l165, l166, l167,
168        l168, l169, l170, l171, l172, l173, l174, l175, l176, l177,
169        l178, l179, l180, l181, l182, l183, l184, l185, l186, l187,
170        l188, l189, l190, l191, l192, l193, l194, l195, l196, l197,
171        l198, l199, l200, l201, l202, l203, l204, l205, l206, l207,
172        l208, l209, l210, l211, l212, l213, l214, l215, l216, l217,
173        l218, l219, l220, l221, l222, l223, l224, l225, l226, l227,
174        l228, l229, l230, l231, l232, l233, l234, l235, l236, l237,
175        l238, l239, l240, l241, l242, l243, l244, l245, l246, l247,
176        l248, l249, l250, l251, l252, l253, l254, l255, l256, l257,
177        l258, l259, l260, l261, l262, l263, l264, l265, l266, l267,
178        l268, l269, l270, l271, l272, l273, l274, l275, l276, l277,
179        l278, l279, l280, l281, l282, l283, l284, l285, l286, l287,
180        l288, l289, l290, l291, l292, l293, l294, l295, l296, l297,
181        l298, l299, l300, l301, l302, l303, l304, l305, l306, l307,
182        l308, l309, l310, l311, l312, l313, l314, l315, l316, l317,
183        l318, l319, l320, l321, l322, l323, l324, l325, l326, l327,
184        l328, l329, l330, l331, l332, l333, l334, l335, l336, l337,
185        l338, l339, l340, l341, l342, l343, l344, l345, l346, l347,
186        l348, l349, l350, l351, l352, l353, l354, l355, l356, l357,
187        l358, l359, l360, l361, l362, l363, l364, l365, l366, l367,
188        l368, l369, l370, l371, l372, l373, l374, l375, l376, l377,
189        l378, l379, l380, l381, l382, l383, l384, l385, l386, l387,
190        l388, l389, l390, l391, l392, l393, l394, l395, l396, l397,
191        l398, l399, l400, l401, l402, l403, l404, l405, l406, l407,
192        l408, l409, l410, l411, l412, l413, l414, l415, l416, l417,
193        l418, l419, l420, l421, l422, l423, l424, l425, l426, l427,
194        l428, l429, l430, l431, l432, l433, l434, l435, l436, l437,
195        l438, l439, l440, l441, l442, l443, l444, l445, l446, l447,
196        l448, l449, l450, l451, l452, l453, l454, l455, l456, l457,
197        l458, l459, l460, l461, l462, l463, l464, l465, l466, l467,
198        l468, l469, l470, l471, l472, l473, l474, l475, l476, l477,
199        l478, l479, l480, l481, l482, l483, l484, l485, l486, l487,
200        l488, l489, l490, l491, l492, l493, l494, l495, l496, l497,
201        l498, l499, l500, l501, l502, l503, l504, l505, l506, l507,
202        l508, l509, l510, l511;
203
204        boolean do_m3 = false;
205        try {
206            do_m3 = m2(deopt);
207        } catch (StackOverflowError e) {
208            return true;
209        }
210        if (do_m3) {
211            try {
212                m1(deopt);
213            } catch (StackOverflowError e) {}
214        }
215        return false;
216    }
217
218    // Used for synchronization betwen threads
219    static volatile boolean thread_started = false;
220    static volatile boolean do_monitor_acquire = false;
221    static volatile boolean monitor_acquired = false;
222    static volatile boolean method_entered = false;
223
224    static Object monitor = new Object();
225
226    static public void main(String[] args) {
227        // get m1 compiled
228        for (int i = 0; i < 20000; i++) {
229            m1(false);
230        }
231
232        Thread thread = new Thread() {
233            public void run() {
234                thread_started = true;
235                while(!do_monitor_acquire);
236                System.out.println("Ok to try to acquire the lock");
237                synchronized(monitor) {
238                    monitor_acquired = true;
239                }
240            }
241        };
242
243        thread.setDaemon(true);
244        thread.start();
245
246        while(!thread_started);
247
248        m2(true);
249
250        if (!method_entered) {
251            System.out.println("TEST PASSED");
252            return;
253        }
254
255        for (int i = 0; i < 10; i++) {
256            System.out.println("Is lock acquired?");
257            if (monitor_acquired) {
258                System.out.println("TEST PASSED");
259                return;
260            }
261            try {
262                Thread.sleep(10000);
263            } catch(InterruptedException ie) {
264            }
265        }
266        System.out.println("TEST FAILED");
267    }
268}
269