aboutsummaryrefslogtreecommitdiff
path: root/unsafe
diff options
context:
space:
mode:
Diffstat (limited to 'unsafe')
-rw-r--r--unsafe/src/main/java/org/apache/spark/unsafe/PlatformDependent.java26
1 files changed, 26 insertions, 0 deletions
diff --git a/unsafe/src/main/java/org/apache/spark/unsafe/PlatformDependent.java b/unsafe/src/main/java/org/apache/spark/unsafe/PlatformDependent.java
index 192c6714b2..b2de2a2590 100644
--- a/unsafe/src/main/java/org/apache/spark/unsafe/PlatformDependent.java
+++ b/unsafe/src/main/java/org/apache/spark/unsafe/PlatformDependent.java
@@ -18,6 +18,7 @@
package org.apache.spark.unsafe;
import java.lang.reflect.Field;
+import java.math.BigInteger;
import sun.misc.Unsafe;
@@ -87,6 +88,14 @@ public final class PlatformDependent {
_UNSAFE.putDouble(object, offset, value);
}
+ public static Object getObjectVolatile(Object object, long offset) {
+ return _UNSAFE.getObjectVolatile(object, offset);
+ }
+
+ public static void putObjectVolatile(Object object, long offset, Object value) {
+ _UNSAFE.putObjectVolatile(object, offset, value);
+ }
+
public static long allocateMemory(long size) {
return _UNSAFE.allocateMemory(size);
}
@@ -107,6 +116,10 @@ public final class PlatformDependent {
public static final int DOUBLE_ARRAY_OFFSET;
+ // Support for resetting final fields while deserializing
+ public static final long BIG_INTEGER_SIGNUM_OFFSET;
+ public static final long BIG_INTEGER_MAG_OFFSET;
+
/**
* Limits the number of bytes to copy per {@link Unsafe#copyMemory(long, long, long)} to
* allow safepoint polling during a large copy.
@@ -129,11 +142,24 @@ public final class PlatformDependent {
INT_ARRAY_OFFSET = _UNSAFE.arrayBaseOffset(int[].class);
LONG_ARRAY_OFFSET = _UNSAFE.arrayBaseOffset(long[].class);
DOUBLE_ARRAY_OFFSET = _UNSAFE.arrayBaseOffset(double[].class);
+
+ long signumOffset = 0;
+ long magOffset = 0;
+ try {
+ signumOffset = _UNSAFE.objectFieldOffset(BigInteger.class.getDeclaredField("signum"));
+ magOffset = _UNSAFE.objectFieldOffset(BigInteger.class.getDeclaredField("mag"));
+ } catch (Exception ex) {
+ // should not happen
+ }
+ BIG_INTEGER_SIGNUM_OFFSET = signumOffset;
+ BIG_INTEGER_MAG_OFFSET = magOffset;
} else {
BYTE_ARRAY_OFFSET = 0;
INT_ARRAY_OFFSET = 0;
LONG_ARRAY_OFFSET = 0;
DOUBLE_ARRAY_OFFSET = 0;
+ BIG_INTEGER_SIGNUM_OFFSET = 0;
+ BIG_INTEGER_MAG_OFFSET = 0;
}
}