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.lang.reflect.Method;
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
29 @InterfaceAudience.Private
30 public class UnsafeAvailChecker {
31
32 private static final String CLASS_NAME = "sun.misc.Unsafe";
33 private static final Log LOG = LogFactory.getLog(UnsafeAvailChecker.class);
34 private static boolean avail = false;
35 private static boolean unaligned = false;
36
37 static {
38 avail = AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
39 @Override
40 public Boolean run() {
41 try {
42 Class<?> clazz = Class.forName(CLASS_NAME);
43 Field f = clazz.getDeclaredField("theUnsafe");
44 f.setAccessible(true);
45 return f.get(null) != null;
46 } catch (Throwable e) {
47 LOG.warn("sun.misc.Unsafe is not available/accessible", e);
48 }
49 return false;
50 }
51 });
52
53 if (avail) {
54 try {
55
56 Class<?> clazz = Class.forName("java.nio.Bits");
57 Method m = clazz.getDeclaredMethod("unaligned");
58 m.setAccessible(true);
59 unaligned = (Boolean) m.invoke(null);
60 } catch (Exception e) {
61 LOG.warn("java.nio.Bits#unaligned() check failed."
62 + "Unsafe based read/write of primitive types won't be used", e);
63 }
64 }
65 }
66
67
68
69
70
71 public static boolean isAvailable() {
72 return avail;
73 }
74
75
76
77
78
79 public static boolean unaligned() {
80 return unaligned;
81 }
82
83 private UnsafeAvailChecker() {
84
85 }
86 }