On 06/25/2013 01:53 AM, Brian Burkhalter wrote:
Branching off from this thread

http://mail.openjdk.java.net/pipermail/core-libs-dev/2013-June/018244.html

I filed this issue (should be public tomorrow)

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=8017540

for the getRadixConversionCache() enhancement. The patch is here

http://cr.openjdk.java.net/~bpb/8017540/

I reviewed and tested the code for correctness and see no issues, so to speak. 
This patch cannot be integrated prior to that for 4641897.

Thanks,

Brian

Hi,

I think this has similar problem (data-race followed by read from half-constructed array) as the prototype that Aleksey constructed here (sorry, I have not seen the forked thread then yet):

http://mail.openjdk.java.net/pipermail/core-libs-dev/2013-June/018368.html


    private static BigInteger getRadixConversionCache(int radix, int exponent) {
        BigInteger retVal = null;
        BigInteger[][] pc = powerCache; // volatile read
        BigInteger[] cacheLine = pc[radix];
        int oldSize = cacheLine.length;
        if (exponent >= oldSize) {
            cacheLine = Arrays.copyOf(cacheLine, exponent + 1);
            for (int i = oldSize; i <= exponent; i++) {
                retVal = cacheLine[i - 1].square();
                cacheLine[i] = retVal;
            }
            pc[radix] = cacheLine;
            powerCache = pc; // publish by volatile write
        } else {
            retVal = cacheLine[exponent];
        }

        return retVal;
     }



Thread A:
    pc = powerCache;

Thread B:
    pc = powerCache;
    cacheLine = pc[radix];
    oldSize = cacheLine.length;
    // enter if, since exponent >= oldSize
    cacheLine = copyOf(cacheLine, exponent+1);
    // ...for loop filling cacheLine...
    pc[radix] = cacheLine;

Thread A:
cacheLine = pc[radix]; // this can read new cache line constructed by Thread B (data-race)
    oldSize = cacheLine.length;
    // skip if, since exponent < oldSize, enter else
retVal = cacheLine[exponent]; // this can read null, since reference to cacheLine was obtained via data-race
    return retval;


What do you think of the code proposed here:

http://mail.openjdk.java.net/pipermail/core-libs-dev/2013-June/018368.html


Regards, Peter

Reply via email to