Skip to content

Commit 7403345

Browse files
committed
Put facade in front of Unsafe.
1 parent 50230c0 commit 7403345

File tree

3 files changed

+87
-12
lines changed

3 files changed

+87
-12
lines changed

unsafe/src/main/java/org/apache/spark/unsafe/PlatformDependent.java

Lines changed: 84 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,82 @@
2323

2424
public final class PlatformDependent {
2525

26-
public static final Unsafe UNSAFE;
26+
/**
27+
* Facade in front of {@link sun.misc.Unsafe}, used to avoid directly exposing Unsafe outside of
28+
* this package. This also lets us aovid accidental use of deprecated methods or methods that
29+
* aren't present in Java 6.
30+
*/
31+
public static final class UNSAFE {
32+
33+
private UNSAFE() { }
34+
35+
public static int getInt(Object object, long offset) {
36+
return _UNSAFE.getInt(object, offset);
37+
}
38+
39+
public static void putInt(Object object, long offset, int value) {
40+
_UNSAFE.putInt(object, offset, value);
41+
}
42+
43+
public static boolean getBoolean(Object object, long offset) {
44+
return _UNSAFE.getBoolean(object, offset);
45+
}
46+
47+
public static void putBoolean(Object object, long offset, boolean value) {
48+
_UNSAFE.putBoolean(object, offset, value);
49+
}
50+
51+
public static byte getByte(Object object, long offset) {
52+
return _UNSAFE.getByte(object, offset);
53+
}
54+
55+
public static void putByte(Object object, long offset, byte value) {
56+
_UNSAFE.putByte(object, offset, value);
57+
}
58+
59+
public static short getShort(Object object, long offset) {
60+
return _UNSAFE.getShort(object, offset);
61+
}
62+
63+
public static void putShort(Object object, long offset, short value) {
64+
_UNSAFE.putShort(object, offset, value);
65+
}
66+
67+
public static long getLong(Object object, long offset) {
68+
return _UNSAFE.getLong(object, offset);
69+
}
70+
71+
public static void putLong(Object object, long offset, long value) {
72+
_UNSAFE.putLong(object, offset, value);
73+
}
74+
75+
public static float getFloat(Object object, long offset) {
76+
return _UNSAFE.getFloat(object, offset);
77+
}
78+
79+
public static void putFloat(Object object, long offset, float value) {
80+
_UNSAFE.putFloat(object, offset, value);
81+
}
82+
83+
public static double getDouble(Object object, long offset) {
84+
return _UNSAFE.getDouble(object, offset);
85+
}
86+
87+
public static void putDouble(Object object, long offset, double value) {
88+
_UNSAFE.putDouble(object, offset, value);
89+
}
90+
91+
public static long allocateMemory(long size) {
92+
return _UNSAFE.allocateMemory(size);
93+
}
94+
95+
public static void freeMemory(long address) {
96+
_UNSAFE.freeMemory(address);
97+
}
98+
99+
}
100+
101+
private static final Unsafe _UNSAFE;
27102

28103
public static final int BYTE_ARRAY_OFFSET;
29104

@@ -48,13 +123,13 @@ public final class PlatformDependent {
48123
} catch (Throwable cause) {
49124
unsafe = null;
50125
}
51-
UNSAFE = unsafe;
126+
_UNSAFE = unsafe;
52127

53-
if (UNSAFE != null) {
54-
BYTE_ARRAY_OFFSET = UNSAFE.arrayBaseOffset(byte[].class);
55-
INT_ARRAY_OFFSET = UNSAFE.arrayBaseOffset(int[].class);
56-
LONG_ARRAY_OFFSET = UNSAFE.arrayBaseOffset(long[].class);
57-
DOUBLE_ARRAY_OFFSET = UNSAFE.arrayBaseOffset(double[].class);
128+
if (_UNSAFE != null) {
129+
BYTE_ARRAY_OFFSET = _UNSAFE.arrayBaseOffset(byte[].class);
130+
INT_ARRAY_OFFSET = _UNSAFE.arrayBaseOffset(int[].class);
131+
LONG_ARRAY_OFFSET = _UNSAFE.arrayBaseOffset(long[].class);
132+
DOUBLE_ARRAY_OFFSET = _UNSAFE.arrayBaseOffset(double[].class);
58133
} else {
59134
BYTE_ARRAY_OFFSET = 0;
60135
INT_ARRAY_OFFSET = 0;
@@ -71,7 +146,7 @@ static public void copyMemory(
71146
long length) {
72147
while (length > 0) {
73148
long size = Math.min(length, UNSAFE_COPY_THRESHOLD);
74-
UNSAFE.copyMemory(src, srcOffset, dst, dstOffset, size);
149+
_UNSAFE.copyMemory(src, srcOffset, dst, dstOffset, size);
75150
length -= size;
76151
srcOffset += size;
77152
dstOffset += size;
@@ -82,6 +157,6 @@ static public void copyMemory(
82157
* Raises an exception bypassing compiler checks for checked exceptions.
83158
*/
84159
public static void throwException(Throwable t) {
85-
UNSAFE.throwException(t);
160+
_UNSAFE.throwException(t);
86161
}
87162
}

unsafe/src/main/java/org/apache/spark/unsafe/map/BytesToBytesMap.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -401,11 +401,11 @@ public void putNewKey(
401401

402402
// Copy the key
403403
PlatformDependent.UNSAFE.putLong(pageBaseObject, keySizeOffsetInPage, keyLengthBytes);
404-
PlatformDependent.UNSAFE.copyMemory(
404+
PlatformDependent.copyMemory(
405405
keyBaseObject, keyBaseOffset, pageBaseObject, keyDataOffsetInPage, keyLengthBytes);
406406
// Copy the value
407407
PlatformDependent.UNSAFE.putLong(pageBaseObject, valueSizeOffsetInPage, valueLengthBytes);
408-
PlatformDependent.UNSAFE.copyMemory(
408+
PlatformDependent.copyMemory(
409409
valueBaseObject, valueBaseOffset, pageBaseObject, valueDataOffsetInPage, valueLengthBytes);
410410

411411
final long storedKeyAddress = memoryManager.encodePageNumberAndOffset(

unsafe/src/test/java/org/apache/spark/unsafe/map/AbstractBytesToBytesMapSuite.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public void tearDown() {
5757

5858
private static byte[] getByteArray(MemoryLocation loc, int size) {
5959
final byte[] arr = new byte[size];
60-
PlatformDependent.UNSAFE.copyMemory(
60+
PlatformDependent.copyMemory(
6161
loc.getBaseObject(),
6262
loc.getBaseOffset(),
6363
arr,

0 commit comments

Comments
 (0)