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