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 @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="REC_CATCH_EXCEPTION",
35 justification="If exception, presume unaligned")
36 public final class UnsafeAccess {
37
38 private static final Log LOG = LogFactory.getLog(UnsafeAccess.class);
39
40 public static final Unsafe theUnsafe;
41
42
43 public static final int BYTE_ARRAY_BASE_OFFSET;
44
45 static {
46 theUnsafe = (Unsafe) AccessController.doPrivileged(new PrivilegedAction<Object>() {
47 @Override
48 public Object run() {
49 try {
50 Field f = Unsafe.class.getDeclaredField("theUnsafe");
51 f.setAccessible(true);
52 return f.get(null);
53 } catch (Throwable e) {
54 LOG.warn("sun.misc.Unsafe is not accessible", e);
55 }
56 return null;
57 }
58 });
59
60 if(theUnsafe != null){
61 BYTE_ARRAY_BASE_OFFSET = theUnsafe.arrayBaseOffset(byte[].class);
62 } else{
63 BYTE_ARRAY_BASE_OFFSET = -1;
64 }
65 }
66
67 private UnsafeAccess(){}
68
69 public static final boolean littleEndian = ByteOrder.nativeOrder()
70 .equals(ByteOrder.LITTLE_ENDIAN);
71 }