/* * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */package $package$;import java.lang.invoke.VarHandle;import org.openjdk.jcstress.annotations.*;import org.openjdk.jcstress.infra.results.$Type$Result2;@JCStressTest@Description("Tests VarHandle methods which take effect of load store fence.")@Outcome(id = "$value0$, $value0$", expect = Expect.ACCEPTABLE, desc = "load var in actor2 before store $value1$ to var in actor1, all results are $value0$")@Outcome(id = "$value1$, $value0$", expect = Expect.ACCEPTABLE, desc = "store $value1$ to var in actor1 before load var in actor2")@Outcome(id = "$value1$, $value1$", expect = Expect.FORBIDDEN, desc = "can't load x after store var in actor1.")@Outcome(id = "$value0$, $value1$", expect = Expect.FORBIDDEN, desc = "this won't happen even if load x after store var because only if r1 = $value1$ x may be assigned to $value1$ and then r2 can be $value1$ from x.")#if[alwaysAtomic]@Outcome(expect = Expect.FORBIDDEN, desc = "Other values are forbidden: atomicity violation.")#else[alwaysAtomic]@Outcome(id = ".*, $value0$", expect = Expect.ACCEPTABLE_SPEC, desc = "Non-atomic access detected, allowed by spec, r2 only can be assigned to 0.")@Ref("http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7")#end[alwaysAtomic]@Statepublic class $TestClassName$ { $type$ x; $type$ field; @Actor public void actor1($Type$Result2 r) { $type$ i = x; %LoadStoreFenceSet% r.r2 = i; } @Actor public void actor2($Type$Result2 r) { r.r1 = field; x = r.r1; }}