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 -Xss256K -XX:-UseOnStackReplacement TestStackBangMonitorOwned
  29  *
  30  */
  31 public 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 }