diff options
Diffstat (limited to 'common/unsafe/src')
-rw-r--r-- | common/unsafe/src/main/java/org/apache/spark/unsafe/Platform.java | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/common/unsafe/src/main/java/org/apache/spark/unsafe/Platform.java b/common/unsafe/src/main/java/org/apache/spark/unsafe/Platform.java index 18761bfd22..672552cc65 100644 --- a/common/unsafe/src/main/java/org/apache/spark/unsafe/Platform.java +++ b/common/unsafe/src/main/java/org/apache/spark/unsafe/Platform.java @@ -18,6 +18,7 @@ package org.apache.spark.unsafe; import java.lang.reflect.Field; +import java.lang.reflect.Method; import sun.misc.Unsafe; @@ -37,6 +38,33 @@ public final class Platform { public static final int DOUBLE_ARRAY_OFFSET; + private static final boolean unaligned; + static { + boolean _unaligned; + // use reflection to access unaligned field + try { + Class<?> bitsClass = + Class.forName("java.nio.Bits", false, ClassLoader.getSystemClassLoader()); + Method unalignedMethod = bitsClass.getDeclaredMethod("unaligned"); + unalignedMethod.setAccessible(true); + _unaligned = Boolean.TRUE.equals(unalignedMethod.invoke(null)); + } catch (Throwable t) { + // We at least know x86 and x64 support unaligned access. + String arch = System.getProperty("os.arch", ""); + //noinspection DynamicRegexReplaceableByCompiledPattern + _unaligned = arch.matches("^(i[3-6]86|x86(_64)?|x64|amd64)$"); + } + unaligned = _unaligned; + } + + /** + * @return true when running JVM is having sun's Unsafe package available in it and underlying + * system having unaligned-access capability. + */ + public static boolean unaligned() { + return unaligned; + } + public static int getInt(Object object, long offset) { return _UNSAFE.getInt(object, offset); } |