1fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko/* 2fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko * Copyright (C) 2009 The Android Open Source Project 3fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko * 4fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko * Licensed under the Apache License, Version 2.0 (the "License"); 5fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko * you may not use this file except in compliance with the License. 6fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko * You may obtain a copy of the License at 7fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko * 8fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko * http://www.apache.org/licenses/LICENSE-2.0 9fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko * 10fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko * Unless required by applicable law or agreed to in writing, software 11fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko * distributed under the License is distributed on an "AS IS" BASIS, 12fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko * See the License for the specific language governing permissions and 14fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko * limitations under the License. 15fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko */ 16fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko 17fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Markoimport java.util.concurrent.*; 18fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Markoimport java.util.concurrent.atomic.AtomicLong; 19fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko 20fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko/** 21fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko * Test for Jit regressions. 22fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko */ 23fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Markopublic class Main { 24fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko public static void main(String args[]) throws Exception { 25fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko b17689750TestVolatile(); 26fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko b17689750TestMonitor(); 27fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko } 28fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko 29fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko static void b17689750TestVolatile() { 30fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko final B17689750TestVolatile test = new B17689750TestVolatile(); 31fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko new Thread() { 32fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko public void run() { 33fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko test.thread1(); 34fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko } 35fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko }.start(); 36fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko try { 37fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko test.thread2(); 38fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko } catch (NullPointerException expected) { 39fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko System.out.println("b17689750TestVolatile passed."); 40fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko } 41fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko } 42fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko 43fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko static void b17689750TestMonitor() { 44fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko final B17689750TestMonitor test = new B17689750TestMonitor(); 45fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko new Thread() { 46fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko public void run() { 47fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko test.thread1(); 48fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko } 49fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko }.start(); 50fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko try { 51fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko test.thread2(); 52fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko } catch (NullPointerException expected) { 53fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko System.out.println("b17689750TestMonitor passed."); 54fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko } 55fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko } 56fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko} 57fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko 58fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Markoclass B17689750TestVolatile { 59fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko private volatile int state = 0; 60fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko private int[] values = { 42 }; 61fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko 62fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko void thread1() { 63fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko while (state != 1) { } // Busy loop. 64fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko values = null; 65fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko state = 2; 66fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko } 67fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko 68fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko void thread2() { 69fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko int[] vs1 = values; 70fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko state = 1; 71fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko while (state != 2) { } // Busy loop. 72fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko int[] vs2 = values; 73fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko int v1 = vs1[0]; 74fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko int v2 = vs2[0]; 75fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko System.out.println("b17689750TestVolatile failed: " + v1 + ", " + v2); 76fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko } 77fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko} 78fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko 79fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Markoclass B17689750TestMonitor { 80fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko private int state = 0; 81fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko private Object lock = new Object(); 82fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko private int[] values = { 42 }; 83fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko 84fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko void thread1() { 85fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko int s; 86fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko do { 87fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko synchronized (lock) { 88fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko s = state; 89fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko } 90fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko } while (s != 1); // Busy loop. 91fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko 92fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko synchronized (lock) { 93fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko values = null; 94fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko state = 2; 95fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko } 96fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko } 97fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko 98fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko void thread2() { 99fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko int[] vs1; 100fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko synchronized (lock) { 101fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko vs1 = values; 102fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko state = 1; 103fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko } 104fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko 105fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko int s; 106fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko do { 107fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko synchronized (lock) { 108fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko s = state; 109fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko } 110fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko } while (s != 2); // Busy loop. 111fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko 112fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko int[] vs2 = values; 113fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko int v1 = vs1[0]; 114fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko int v2 = vs2[0]; 115fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko System.out.println("b17689750TestMonitor failed: " + v1 + ", " + v2); 116fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko } 117fa23645319cca1f1c4a7c208f931820f6783b1a4Vladimir Marko} 118