/************************************************************************** * Copyright (c) 2008 by Chris Gray. All rights reserved. * **************************************************************************/ package gnu.testlet.wonka.vm; import gnu.testlet.*; public class VolatileTest implements Testlet, Runnable { static volatile long static_glare = 0x0123456789abcdefL; private static boolean running; private static int count0; private static int count1; private static int count2; private VolatileTest parent; protected TestHarness th; private volatile long instance_glare; private boolean test_static; public VolatileTest() { } private VolatileTest(VolatileTest parent, boolean test_static) { this.parent = parent; this.test_static = test_static; } public void test(TestHarness harness) { parent = this; instance_glare = 0x0123456789abcdefL; th = harness; th.checkPoint("Testing volatile long fields"); th.setclass("java.lang.Long"); running = true; for (int i = 0; i < 50; ++i) { new Thread(new VolatileTest(this, (i % 2) == 0)).start(); } try { for (count0 = 0; count0 < 1000000 && count1 < 1000000 && count2 < 1000000; ++count0) { long copy = static_glare; if (copy != 0xf0123456789abcdeL && copy != 0xef0123456789abcdL && copy != 0xdef0123456789abcL && copy != 0xcdef0123456789abL && copy != 0xbcdef0123456789aL && copy != 0xabcdef0123456789L && copy != 0x9abcdef012345678L && copy != 0x89abcdef01234567L && copy != 0x789abcdef0123456L && copy != 0x6789abcdef012345L && copy != 0x56789abcdef01234L && copy != 0x456789abcdef0123L && copy != 0x3456789abcdef012L && copy != 0x23456789abcdef01L && copy != 0x123456789abcdef0L && copy != 0x0123456789abcdefL ) { throw new RuntimeException("static_glare = " + Long.toHexString(copy)); } copy = instance_glare; if (copy != 0xf0123456789abcdeL && copy != 0xef0123456789abcdL && copy != 0xdef0123456789abcL && copy != 0xcdef0123456789abL && copy != 0xbcdef0123456789aL && copy != 0xabcdef0123456789L && copy != 0x9abcdef012345678L && copy != 0x89abcdef01234567L && copy != 0x789abcdef0123456L && copy != 0x6789abcdef012345L && copy != 0x56789abcdef01234L && copy != 0x456789abcdef0123L && copy != 0x3456789abcdef012L && copy != 0x23456789abcdef01L && copy != 0x123456789abcdef0L && copy != 0x0123456789abcdefL ) { throw new RuntimeException("instance_glare = " + Long.toHexString(copy)); } } } finally { running = false; } } public void run() { int foo = 0; if (test_static) { while (running) { static_glare = 0xf0123456789abcdeL; static_glare = 0xef0123456789abcdL; static_glare = 0xdef0123456789abcL; static_glare = 0xcdef0123456789abL; static_glare = 0xbcdef0123456789aL; static_glare = 0xabcdef0123456789L; static_glare = 0x9abcdef012345678L; static_glare = 0x89abcdef01234567L; static_glare = 0x789abcdef0123456L; static_glare = 0x6789abcdef012345L; static_glare = 0x56789abcdef01234L; static_glare = 0x456789abcdef0123L; static_glare = 0x3456789abcdef012L; static_glare = 0x23456789abcdef01L; static_glare = 0x123456789abcdef0L; static_glare = 0x0123456789abcdefL; count1 += 16; if (count1 > 1000000) { return; } } } else { while (running) { parent.instance_glare = 0xf0123456789abcdeL; parent.instance_glare = 0xef0123456789abcdL; parent.instance_glare = 0xdef0123456789abcL; parent.instance_glare = 0xcdef0123456789abL; parent.instance_glare = 0xbcdef0123456789aL; parent.instance_glare = 0xabcdef0123456789L; parent.instance_glare = 0x9abcdef012345678L; parent.instance_glare = 0x89abcdef01234567L; parent.instance_glare = 0x789abcdef0123456L; parent.instance_glare = 0x6789abcdef012345L; parent.instance_glare = 0x56789abcdef01234L; parent.instance_glare = 0x456789abcdef0123L; parent.instance_glare = 0x3456789abcdef012L; parent.instance_glare = 0x23456789abcdef01L; parent.instance_glare = 0x123456789abcdef0L; parent.instance_glare = 0x0123456789abcdefL; count2 += 16; if (count2 > 1000000) { return; } } } } }