harmony-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Vera Petrashkova (JIRA)" <j...@apache.org>
Subject [jira] Created: (HARMONY-2092) [drlvm] Harmony works with volatile variables incorrectly
Date Wed, 08 Nov 2006 04:40:51 GMT
[drlvm] Harmony works with volatile variables incorrectly
---------------------------------------------------------

                 Key: HARMONY-2092
                 URL: http://issues.apache.org/jira/browse/HARMONY-2092
             Project: Harmony
          Issue Type: Bug
          Components: DRLVM
         Environment: Windows and Linux
            Reporter: Vera Petrashkova


When Long_MAX_VALUE or Long.MIN_VALUE should be assigned to volatile variable then
VM works incorrectly.
Code for reproducing:
------------------volatileTest.java-----------------
public class volatileTest  {

    public static int delay = 5000;
    private boolean interruptFlag = false;

    long hi;
    long lo;
    volatile long v;

    public static void main(String [] args ) {
        int maxI = 20;
        for (int i = 0; i < maxI; i++) {
            int t = new volatileTest().test(delay);
            System.out.println((t == 104 ? "Test passed: ": "Test failed: ") 
                + t + "  (step: " + i + ")");
        }
    }

    public synchronized void interrupt() {
        interruptFlag = true;
    }

    public synchronized boolean interrupted() {
        return interruptFlag;
    }

    public volatileTest() {
        super();
        hi = Long.MAX_VALUE;
        lo = Long.MIN_VALUE;
        v = hi;              
    }


    public int test(int delay)  {        
        boolean passed = true;
        Thread_1_class  t1 = new Thread_1_class(this);
        Thread_2_class t2 = new Thread_2_class(this);
        Interruptor killer = new Interruptor(this, delay);
        try {
            t1.start();
            t2.start();
            killer.start();
      
            while (!interrupted()) {
                Thread.yield();
                long v3 = v;
                if (v3 != hi && v3 != lo) { 
                    System.out.println(v3+"  "+hi +"  "+lo);
                    passed = false;
                    break;
                }            
            }
            t1.interrupt();
            t2.interrupt();
            return passed ? 104 : 105;
       } catch (Throwable e) {
           e.printStackTrace();
           return 106;
       }
    }
}
class Thread_1_class extends Thread {
   volatileTest thh;
   public Thread_1_class (volatileTest t) {
       super();
       thh = t;
   }
   public void run() {
       while (!isInterrupted()) {
           thh.v = thh.lo;
           thh.v = thh.hi;
       }
   }
}

class Thread_2_class extends Thread {
   volatileTest thh;
   public Thread_2_class (volatileTest t) {
       super();
       thh = t;
   }
   public void run() {
       while (!isInterrupted()) {
                thh.v = thh.hi;
                thh.v = thh.lo;
            }
   }
}

class Interruptor extends Thread {
    volatileTest t;
    int delay;

    public Interruptor(volatileTest t, int delay) {
        this.t = t;
        this.delay = delay;
    }

    public void run() {
        try {
            Thread.sleep(delay);
        } catch (InterruptedException e) {
        }
        t.interrupt();
    }
}
----------------------------

Output on RI:
================
java version "1.5.0_06"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05)
Java HotSpot(TM) Client VM (build 1.5.0_06-b05, mixed mode)

Test passed: 104  (step: 0)
Test passed: 104  (step: 1)
Test passed: 104  (step: 2)
Test passed: 104  (step: 3)
Test passed: 104  (step: 4)
Test passed: 104  (step: 5)
Test passed: 104  (step: 6)
Test passed: 104  (step: 7)
Test passed: 104  (step: 8)
Test passed: 104  (step: 9)
Test passed: 104  (step: 10)
Test passed: 104  (step: 11)
Test passed: 104  (step: 12)
Test passed: 104  (step: 13)
Test passed: 104  (step: 14)
Test passed: 104  (step: 15)
Test passed: 104  (step: 16)
Test passed: 104  (step: 17)
Test passed: 104  (step: 18)
Test passed: 104  (step: 19)

Output on Harmony:
====================
Apache Harmony Launcher : (c) Copyright 1991, 2006 The Apache Software Foundation or its licensors,
as applicable.
java version "1.5.0"
pre-alpha : not complete or compatible
svn = r471468, (Nov  7 2006), Windows/ia32/msvc 1310, release build
http://incubator.apache.org/harmony
Test passed: 104  (step: 0)
Test passed: 104  (step: 1)
Test passed: 104  (step: 2)
Test passed: 104  (step: 3)
Test passed: 104  (step: 4)
Test passed: 104  (step: 5)
Test passed: 104  (step: 6)
Test passed: 104  (step: 7)
Test passed: 104  (step: 8)
Test passed: 104  (step: 9)
Test passed: 104  (step: 10)
9223372032559808512  9223372036854775807  -9223372036854775808
Test failed: 105  (step: 11)
Test passed: 104  (step: 12)
9223372032559808512  9223372036854775807  -9223372036854775808
Test failed: 105  (step: 13)
Test passed: 104  (step: 14)
Test passed: 104  (step: 15)
-9223372032559808513  9223372036854775807  -9223372036854775808
Test failed: 105  (step: 16)
-9223372032559808513  9223372036854775807  -9223372036854775808
Test failed: 105  (step: 17)
Test passed: 104  (step: 18)
Test passed: 104  (step: 19)

Apache Harmony Launcher : (c) Copyright 1991, 2006 The Apache Software Foundation or its licensors,
as applicable.
java version "1.5.0" 
pre-alpha : not complete or compatible
svn = r471468, (Nov  7 2006), Linux/ia32/gcc 3.3.3, release build
http://incubator.apache.org/harmony
-9223372032559808513  9223372036854775807  -9223372036854775808
Test failed: 105  (step: 0)
9223372032559808512  9223372036854775807  -9223372036854775808
Test failed: 105  (step: 1)
9223372032559808512  9223372036854775807  -9223372036854775808
Test failed: 105  (step: 2)
9223372032559808512  9223372036854775807  -9223372036854775808
Test failed: 105  (step: 3)
9223372032559808512  9223372036854775807  -9223372036854775808
Test failed: 105  (step: 4)
-9223372032559808513  9223372036854775807  -9223372036854775808
Test failed: 105  (step: 5)
9223372032559808512  9223372036854775807  -9223372036854775808
Test failed: 105  (step: 6)
9223372032559808512  9223372036854775807  -9223372036854775808
Test failed: 105  (step: 7)
-9223372032559808513  9223372036854775807  -9223372036854775808
Test failed: 105  (step: 8)
9223372032559808512  9223372036854775807  -9223372036854775808
Test failed: 105  (step: 9)
9223372032559808512  9223372036854775807  -9223372036854775808
Test failed: 105  (step: 10)
-9223372032559808513  9223372036854775807  -9223372036854775808
Test failed: 105  (step: 11)
-9223372032559808513  9223372036854775807  -9223372036854775808
Test failed: 105  (step: 12)
9223372032559808512  9223372036854775807  -9223372036854775808
Test failed: 105  (step: 13)
-9223372032559808513  9223372036854775807  -9223372036854775808
Test failed: 105  (step: 14)
-9223372032559808513  9223372036854775807  -9223372036854775808
Test failed: 105  (step: 15)
9223372032559808512  9223372036854775807  -9223372036854775808
Test failed: 105  (step: 16)
9223372032559808512  9223372036854775807  -9223372036854775808
Test failed: 105  (step: 17)
-9223372032559808513  9223372036854775807  -9223372036854775808
Test failed: 105  (step: 18)
9223372032559808512  9223372036854775807  -9223372036854775808
Test failed: 105  (step: 19)



This bug is reproducible on Jitrino (JET/OPT) and on interpreter:
java -cp . volatileTest
java -cp . -Xint volatileTest
java -cp . -Xem:opt volatileTest




-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Mime
View raw message