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