< prev index next >

src/java.base/share/classes/jdk/internal/misc/Unsafe.java

Print this page

        

*** 1416,1425 **** --- 1416,1704 ---- int expected, int x) { return compareAndSwapInt(o, offset, expected, x); } + @HotSpotIntrinsicCandidate + public final byte compareAndExchangeByteVolatile(Object o, long offset, + byte expected, + byte x) { + long wordOffset = offset & ~3; + int shift = (int) (offset & 3) << 3; + if (BE) { + shift = 24 - shift; + } + int mask = 0xFF << shift; + int maskedExpected = (expected & 0xFF) << shift; + int maskedX = (x & 0xFF) << shift; + int fullWord; + do { + fullWord = getIntVolatile(o, wordOffset); + if ((fullWord & mask) != maskedExpected) + return (byte) ((fullWord & mask) >> shift); + } while (!weakCompareAndSwapIntVolatile(o, wordOffset, + fullWord, (fullWord & ~mask) | maskedX)); + return expected; + } + + @HotSpotIntrinsicCandidate + public final boolean compareAndSwapByte(Object o, long offset, + byte expected, + byte x) { + return compareAndExchangeByteVolatile(o, offset, expected, x) == expected; + } + + @HotSpotIntrinsicCandidate + public final boolean weakCompareAndSwapByteVolatile(Object o, long offset, + byte expected, + byte x) { + return compareAndSwapByte(o, offset, expected, x); + } + + @HotSpotIntrinsicCandidate + public final boolean weakCompareAndSwapByteAcquire(Object o, long offset, + byte expected, + byte x) { + return weakCompareAndSwapByteVolatile(o, offset, expected, x); + } + + @HotSpotIntrinsicCandidate + public final boolean weakCompareAndSwapByteRelease(Object o, long offset, + byte expected, + byte x) { + return weakCompareAndSwapByteVolatile(o, offset, expected, x); + } + + @HotSpotIntrinsicCandidate + public final boolean weakCompareAndSwapByte(Object o, long offset, + byte expected, + byte x) { + return weakCompareAndSwapByteVolatile(o, offset, expected, x); + } + + @HotSpotIntrinsicCandidate + public final byte compareAndExchangeByteAcquire(Object o, long offset, + byte expected, + byte x) { + return compareAndExchangeByteVolatile(o, offset, expected, x); + } + + @HotSpotIntrinsicCandidate + public final byte compareAndExchangeByteRelease(Object o, long offset, + byte expected, + byte x) { + return compareAndExchangeByteVolatile(o, offset, expected, x); + } + + @HotSpotIntrinsicCandidate + public final short compareAndExchangeShortVolatile(Object o, long offset, + short expected, + short x) { + if ((offset & 3) == 3) { + throw new IllegalArgumentException("Update spans the word, not supported"); + } + long wordOffset = offset & ~3; + int shift = (int) (offset & 3) << 3; + if (BE) { + shift = 16 - shift; + } + int mask = 0xFFFF << shift; + int maskedExpected = (expected & 0xFFFF) << shift; + int maskedX = (x & 0xFFFF) << shift; + int fullWord; + do { + fullWord = getIntVolatile(o, wordOffset); + if ((fullWord & mask) != maskedExpected) { + return (short) ((fullWord & mask) >> shift); + } + } while (!weakCompareAndSwapIntVolatile(o, wordOffset, + fullWord, (fullWord & ~mask) | maskedX)); + return expected; + } + + @HotSpotIntrinsicCandidate + public final boolean compareAndSwapShort(Object o, long offset, + short expected, + short x) { + return compareAndExchangeShortVolatile(o, offset, expected, x) == expected; + } + + @HotSpotIntrinsicCandidate + public final boolean weakCompareAndSwapShortVolatile(Object o, long offset, + short expected, + short x) { + return compareAndSwapShort(o, offset, expected, x); + } + + @HotSpotIntrinsicCandidate + public final boolean weakCompareAndSwapShortAcquire(Object o, long offset, + short expected, + short x) { + return weakCompareAndSwapShortVolatile(o, offset, expected, x); + } + + @HotSpotIntrinsicCandidate + public final boolean weakCompareAndSwapShortRelease(Object o, long offset, + short expected, + short x) { + return weakCompareAndSwapShortVolatile(o, offset, expected, x); + } + + @HotSpotIntrinsicCandidate + public final boolean weakCompareAndSwapShort(Object o, long offset, + short expected, + short x) { + return weakCompareAndSwapShortVolatile(o, offset, expected, x); + } + + + @HotSpotIntrinsicCandidate + public final short compareAndExchangeShortAcquire(Object o, long offset, + short expected, + short x) { + return compareAndExchangeShortVolatile(o, offset, expected, x); + } + + @HotSpotIntrinsicCandidate + public final short compareAndExchangeShortRelease(Object o, long offset, + short expected, + short x) { + return compareAndExchangeShortVolatile(o, offset, expected, x); + } + + @ForceInline + private char s2c(short s) { + return (char) s; + } + + @ForceInline + private short c2s(char s) { + return (short) s; + } + + @ForceInline + public final boolean compareAndSwapChar(Object o, long offset, + char expected, + char x) { + return compareAndSwapShort(o, offset, c2s(expected), c2s(x)); + } + + @ForceInline + public final char compareAndExchangeCharVolatile(Object o, long offset, + char expected, + char x) { + return s2c(compareAndExchangeShortVolatile(o, offset, c2s(expected), c2s(x))); + } + + @ForceInline + public final char compareAndExchangeCharAcquire(Object o, long offset, + char expected, + char x) { + return s2c(compareAndExchangeShortAcquire(o, offset, c2s(expected), c2s(x))); + } + + @ForceInline + public final char compareAndExchangeCharRelease(Object o, long offset, + char expected, + char x) { + return s2c(compareAndExchangeShortRelease(o, offset, c2s(expected), c2s(x))); + } + + @ForceInline + public final boolean weakCompareAndSwapCharVolatile(Object o, long offset, + char expected, + char x) { + return weakCompareAndSwapShortVolatile(o, offset, c2s(expected), c2s(x)); + } + + @ForceInline + public final boolean weakCompareAndSwapCharAcquire(Object o, long offset, + char expected, + char x) { + return weakCompareAndSwapShortAcquire(o, offset, c2s(expected), c2s(x)); + } + + @ForceInline + public final boolean weakCompareAndSwapCharRelease(Object o, long offset, + char expected, + char x) { + return weakCompareAndSwapShortRelease(o, offset, c2s(expected), c2s(x)); + } + + @ForceInline + public final boolean weakCompareAndSwapChar(Object o, long offset, + char expected, + char x) { + return weakCompareAndSwapShort(o, offset, c2s(expected), c2s(x)); + } + + @ForceInline + private boolean byte2bool(byte b) { + return b > 0; + } + + @ForceInline + private byte bool2byte(boolean b) { + return b ? (byte)1 : (byte)0; + } + + @ForceInline + public final boolean compareAndSwapBoolean(Object o, long offset, + boolean expected, + boolean x) { + return compareAndSwapByte(o, offset, bool2byte(expected), bool2byte(x)); + } + + @ForceInline + public final boolean compareAndExchangeBooleanVolatile(Object o, long offset, + boolean expected, + boolean x) { + return byte2bool(compareAndExchangeByteVolatile(o, offset, bool2byte(expected), bool2byte(x))); + } + + @ForceInline + public final boolean compareAndExchangeBooleanAcquire(Object o, long offset, + boolean expected, + boolean x) { + return byte2bool(compareAndExchangeByteAcquire(o, offset, bool2byte(expected), bool2byte(x))); + } + + @ForceInline + public final boolean compareAndExchangeBooleanRelease(Object o, long offset, + boolean expected, + boolean x) { + return byte2bool(compareAndExchangeByteRelease(o, offset, bool2byte(expected), bool2byte(x))); + } + + @ForceInline + public final boolean weakCompareAndSwapBooleanVolatile(Object o, long offset, + boolean expected, + boolean x) { + return weakCompareAndSwapByteVolatile(o, offset, bool2byte(expected), bool2byte(x)); + } + + @ForceInline + public final boolean weakCompareAndSwapBooleanAcquire(Object o, long offset, + boolean expected, + boolean x) { + return weakCompareAndSwapByteAcquire(o, offset, bool2byte(expected), bool2byte(x)); + } + + @ForceInline + public final boolean weakCompareAndSwapBooleanRelease(Object o, long offset, + boolean expected, + boolean x) { + return weakCompareAndSwapByteRelease(o, offset, bool2byte(expected), bool2byte(x)); + } + + @ForceInline + public final boolean weakCompareAndSwapBoolean(Object o, long offset, + boolean expected, + boolean x) { + return weakCompareAndSwapByte(o, offset, bool2byte(expected), bool2byte(x)); + } + /** * Atomically updates Java variable to {@code x} if it is currently * holding {@code expected}. * * <p>This operation has memory semantics of a {@code volatile} read
*** 1856,1866 **** @HotSpotIntrinsicCandidate public final int getAndAddInt(Object o, long offset, int delta) { int v; do { v = getIntVolatile(o, offset); ! } while (!compareAndSwapInt(o, offset, v, v + delta)); return v; } /** * Atomically adds the given value to the current value of a field --- 2135,2145 ---- @HotSpotIntrinsicCandidate public final int getAndAddInt(Object o, long offset, int delta) { int v; do { v = getIntVolatile(o, offset); ! } while (!weakCompareAndSwapIntVolatile(o, offset, v, v + delta)); return v; } /** * Atomically adds the given value to the current value of a field
*** 1876,1889 **** @HotSpotIntrinsicCandidate public final long getAndAddLong(Object o, long offset, long delta) { long v; do { v = getLongVolatile(o, offset); ! } while (!compareAndSwapLong(o, offset, v, v + delta)); return v; } /** * Atomically exchanges the given value with the current value of * a field or array element within the given object {@code o} * at the given {@code offset}. * --- 2155,2190 ---- @HotSpotIntrinsicCandidate public final long getAndAddLong(Object o, long offset, long delta) { long v; do { v = getLongVolatile(o, offset); ! } while (!weakCompareAndSwapLongVolatile(o, offset, v, v + delta)); return v; } + @HotSpotIntrinsicCandidate + public final byte getAndAddByte(Object o, long offset, byte delta) { + byte v; + do { + v = getByteVolatile(o, offset); + } while (!weakCompareAndSwapByteVolatile(o, offset, v, (byte) (v + delta))); + return v; + } + + @HotSpotIntrinsicCandidate + public final short getAndAddShort(Object o, long offset, short delta) { + short v; + do { + v = getShortVolatile(o, offset); + } while (!weakCompareAndSwapShortVolatile(o, offset, v, (short) (v + delta))); + return v; + } + + public final char getAndAddChar(Object o, long offset, char delta) { + return (char) getAndAddShort(o, offset, (short) delta); + } + /** * Atomically exchanges the given value with the current value of * a field or array element within the given object {@code o} * at the given {@code offset}. *
*** 1896,1906 **** @HotSpotIntrinsicCandidate public final int getAndSetInt(Object o, long offset, int newValue) { int v; do { v = getIntVolatile(o, offset); ! } while (!compareAndSwapInt(o, offset, v, newValue)); return v; } /** * Atomically exchanges the given value with the current value of --- 2197,2207 ---- @HotSpotIntrinsicCandidate public final int getAndSetInt(Object o, long offset, int newValue) { int v; do { v = getIntVolatile(o, offset); ! } while (!weakCompareAndSwapIntVolatile(o, offset, v, newValue)); return v; } /** * Atomically exchanges the given value with the current value of
*** 1916,1926 **** @HotSpotIntrinsicCandidate public final long getAndSetLong(Object o, long offset, long newValue) { long v; do { v = getLongVolatile(o, offset); ! } while (!compareAndSwapLong(o, offset, v, newValue)); return v; } /** * Atomically exchanges the given reference value with the current --- 2217,2227 ---- @HotSpotIntrinsicCandidate public final long getAndSetLong(Object o, long offset, long newValue) { long v; do { v = getLongVolatile(o, offset); ! } while (!weakCompareAndSwapLongVolatile(o, offset, v, newValue)); return v; } /** * Atomically exchanges the given reference value with the current
*** 1936,1949 **** @HotSpotIntrinsicCandidate public final Object getAndSetObject(Object o, long offset, Object newValue) { Object v; do { v = getObjectVolatile(o, offset); ! } while (!compareAndSwapObject(o, offset, v, newValue)); return v; } /** * Ensures that loads before the fence will not be reordered with loads and * stores after the fence; a "LoadLoad plus LoadStore barrier". * --- 2237,2275 ---- @HotSpotIntrinsicCandidate public final Object getAndSetObject(Object o, long offset, Object newValue) { Object v; do { v = getObjectVolatile(o, offset); ! } while (!weakCompareAndSwapObjectVolatile(o, offset, v, newValue)); ! return v; ! } ! ! @HotSpotIntrinsicCandidate ! public final byte getAndSetByte(Object o, long offset, byte newValue) { ! byte v; ! do { ! v = getByteVolatile(o, offset); ! } while (!weakCompareAndSwapByteVolatile(o, offset, v, newValue)); ! return v; ! } ! ! public final boolean getAndSetBoolean(Object o, long offset, boolean newValue) { ! return byte2bool(getAndSetByte(o, offset, bool2byte(newValue))); ! } ! ! @HotSpotIntrinsicCandidate ! public final short getAndSetShort(Object o, long offset, short newValue) { ! short v; ! do { ! v = getShortVolatile(o, offset); ! } while (!weakCompareAndSwapShortVolatile(o, offset, v, newValue)); return v; } + public final char getAndSetChar(Object o, long offset, char newValue) { + return s2c(getAndSetShort(o, offset, c2s(newValue))); + } /** * Ensures that loads before the fence will not be reordered with loads and * stores after the fence; a "LoadLoad plus LoadStore barrier". *
< prev index next >