Skip to content

Commit

Permalink
Put facade in front of Unsafe.
Browse files Browse the repository at this point in the history
  • Loading branch information
JoshRosen committed Apr 30, 2015
1 parent 50230c0 commit 7403345
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,82 @@

public final class PlatformDependent {

public static final Unsafe UNSAFE;
/**
* Facade in front of {@link sun.misc.Unsafe}, used to avoid directly exposing Unsafe outside of
* this package. This also lets us aovid accidental use of deprecated methods or methods that
* aren't present in Java 6.
*/
public static final class UNSAFE {

private UNSAFE() { }

public static int getInt(Object object, long offset) {
return _UNSAFE.getInt(object, offset);
}

public static void putInt(Object object, long offset, int value) {
_UNSAFE.putInt(object, offset, value);
}

public static boolean getBoolean(Object object, long offset) {
return _UNSAFE.getBoolean(object, offset);
}

public static void putBoolean(Object object, long offset, boolean value) {
_UNSAFE.putBoolean(object, offset, value);
}

public static byte getByte(Object object, long offset) {
return _UNSAFE.getByte(object, offset);
}

public static void putByte(Object object, long offset, byte value) {
_UNSAFE.putByte(object, offset, value);
}

public static short getShort(Object object, long offset) {
return _UNSAFE.getShort(object, offset);
}

public static void putShort(Object object, long offset, short value) {
_UNSAFE.putShort(object, offset, value);
}

public static long getLong(Object object, long offset) {
return _UNSAFE.getLong(object, offset);
}

public static void putLong(Object object, long offset, long value) {
_UNSAFE.putLong(object, offset, value);
}

public static float getFloat(Object object, long offset) {
return _UNSAFE.getFloat(object, offset);
}

public static void putFloat(Object object, long offset, float value) {
_UNSAFE.putFloat(object, offset, value);
}

public static double getDouble(Object object, long offset) {
return _UNSAFE.getDouble(object, offset);
}

public static void putDouble(Object object, long offset, double value) {
_UNSAFE.putDouble(object, offset, value);
}

public static long allocateMemory(long size) {
return _UNSAFE.allocateMemory(size);
}

public static void freeMemory(long address) {
_UNSAFE.freeMemory(address);
}

}

private static final Unsafe _UNSAFE;

public static final int BYTE_ARRAY_OFFSET;

Expand All @@ -48,13 +123,13 @@ public final class PlatformDependent {
} catch (Throwable cause) {
unsafe = null;
}
UNSAFE = unsafe;
_UNSAFE = unsafe;

if (UNSAFE != null) {
BYTE_ARRAY_OFFSET = UNSAFE.arrayBaseOffset(byte[].class);
INT_ARRAY_OFFSET = UNSAFE.arrayBaseOffset(int[].class);
LONG_ARRAY_OFFSET = UNSAFE.arrayBaseOffset(long[].class);
DOUBLE_ARRAY_OFFSET = UNSAFE.arrayBaseOffset(double[].class);
if (_UNSAFE != null) {
BYTE_ARRAY_OFFSET = _UNSAFE.arrayBaseOffset(byte[].class);
INT_ARRAY_OFFSET = _UNSAFE.arrayBaseOffset(int[].class);
LONG_ARRAY_OFFSET = _UNSAFE.arrayBaseOffset(long[].class);
DOUBLE_ARRAY_OFFSET = _UNSAFE.arrayBaseOffset(double[].class);
} else {
BYTE_ARRAY_OFFSET = 0;
INT_ARRAY_OFFSET = 0;
Expand All @@ -71,7 +146,7 @@ static public void copyMemory(
long length) {
while (length > 0) {
long size = Math.min(length, UNSAFE_COPY_THRESHOLD);
UNSAFE.copyMemory(src, srcOffset, dst, dstOffset, size);
_UNSAFE.copyMemory(src, srcOffset, dst, dstOffset, size);
length -= size;
srcOffset += size;
dstOffset += size;
Expand All @@ -82,6 +157,6 @@ static public void copyMemory(
* Raises an exception bypassing compiler checks for checked exceptions.
*/
public static void throwException(Throwable t) {
UNSAFE.throwException(t);
_UNSAFE.throwException(t);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -401,11 +401,11 @@ public void putNewKey(

// Copy the key
PlatformDependent.UNSAFE.putLong(pageBaseObject, keySizeOffsetInPage, keyLengthBytes);
PlatformDependent.UNSAFE.copyMemory(
PlatformDependent.copyMemory(
keyBaseObject, keyBaseOffset, pageBaseObject, keyDataOffsetInPage, keyLengthBytes);
// Copy the value
PlatformDependent.UNSAFE.putLong(pageBaseObject, valueSizeOffsetInPage, valueLengthBytes);
PlatformDependent.UNSAFE.copyMemory(
PlatformDependent.copyMemory(
valueBaseObject, valueBaseOffset, pageBaseObject, valueDataOffsetInPage, valueLengthBytes);

final long storedKeyAddress = memoryManager.encodePageNumberAndOffset(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public void tearDown() {

private static byte[] getByteArray(MemoryLocation loc, int size) {
final byte[] arr = new byte[size];
PlatformDependent.UNSAFE.copyMemory(
PlatformDependent.copyMemory(
loc.getBaseObject(),
loc.getBaseOffset(),
arr,
Expand Down

0 comments on commit 7403345

Please sign in to comment.