1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.util;
19
20 import java.lang.reflect.Field;
21 import java.nio.ByteOrder;
22 import java.security.AccessController;
23 import java.security.PrivilegedAction;
24
25 import org.apache.commons.logging.Log;
26 import org.apache.commons.logging.LogFactory;
27 import org.apache.hadoop.hbase.classification.InterfaceAudience;
28 import org.apache.hadoop.hbase.classification.InterfaceStability;
29
30 import sun.misc.Unsafe;
31
32 @InterfaceAudience.Private
33 @InterfaceStability.Evolving
34 public final class UnsafeAccess {
35
36 private static final Log LOG = LogFactory.getLog(UnsafeAccess.class);
37
38 public static final Unsafe theUnsafe;
39
40
41 public static final int BYTE_ARRAY_BASE_OFFSET;
42
43 static {
44 theUnsafe = (Unsafe) AccessController.doPrivileged(new PrivilegedAction<Object>() {
45 @Override
46 public Object run() {
47 try {
48 Field f = Unsafe.class.getDeclaredField("theUnsafe");
49 f.setAccessible(true);
50 return f.get(null);
51 } catch (Throwable e) {
52 LOG.warn("sun.misc.Unsafe is not accessible", e);
53 }
54 return null;
55 }
56 });
57
58 if(theUnsafe != null){
59 BYTE_ARRAY_BASE_OFFSET = theUnsafe.arrayBaseOffset(byte[].class);
60 } else{
61 BYTE_ARRAY_BASE_OFFSET = -1;
62 }
63 }
64
65 private UnsafeAccess(){}
66
67 public static final boolean littleEndian = ByteOrder.nativeOrder()
68 .equals(ByteOrder.LITTLE_ENDIAN);
69 }