1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package io.netty.channel.epoll;
17
18 import io.netty.channel.ChannelOption;
19 import io.netty.channel.unix.FileDescriptor;
20 import io.netty.util.internal.SystemPropertyUtil;
21 import io.netty.util.internal.logging.InternalLogger;
22 import io.netty.util.internal.logging.InternalLoggerFactory;
23
24
25
26
27
28 public final class Epoll {
29
30 private static final Throwable UNAVAILABILITY_CAUSE;
31
32 static {
33 Throwable cause = null;
34
35 if (SystemPropertyUtil.getBoolean("io.netty.transport.noNative", false)) {
36 cause = new UnsupportedOperationException(
37 "Native transport was explicit disabled with -Dio.netty.transport.noNative=true");
38 } else {
39 FileDescriptor epollFd = null;
40 FileDescriptor eventFd = null;
41 try {
42 epollFd = Native.newEpollCreate();
43 eventFd = Native.newEventFd();
44 } catch (Throwable t) {
45 cause = t;
46 } finally {
47 if (epollFd != null) {
48 try {
49 epollFd.close();
50 } catch (Exception ignore) {
51
52 }
53 }
54 if (eventFd != null) {
55 try {
56 eventFd.close();
57 } catch (Exception ignore) {
58
59 }
60 }
61 }
62 }
63 if (cause != null) {
64 InternalLogger logger = InternalLoggerFactory.getInstance(Epoll.class);
65 if (logger.isTraceEnabled()) {
66 logger.debug("Epoll support is not available", cause);
67 } else if (logger.isDebugEnabled()) {
68 logger.debug("Epoll support is not available: {}", cause.getMessage());
69 }
70 }
71 UNAVAILABILITY_CAUSE = cause;
72 }
73
74
75
76
77
78 public static boolean isAvailable() {
79 return UNAVAILABILITY_CAUSE == null;
80 }
81
82
83
84
85
86
87
88 public static void ensureAvailability() {
89 if (UNAVAILABILITY_CAUSE != null) {
90 throw (Error) new UnsatisfiedLinkError(
91 "failed to load the required native library").initCause(UNAVAILABILITY_CAUSE);
92 }
93 }
94
95
96
97
98
99
100
101 public static Throwable unavailabilityCause() {
102 return UNAVAILABILITY_CAUSE;
103 }
104
105
106
107
108
109
110
111 public static boolean isTcpFastOpenClientSideAvailable() {
112 return isAvailable() && Native.IS_SUPPORTING_TCP_FASTOPEN_CLIENT;
113 }
114
115
116
117
118
119
120
121 public static boolean isTcpFastOpenServerSideAvailable() {
122 return isAvailable() && Native.IS_SUPPORTING_TCP_FASTOPEN_SERVER;
123 }
124
125 private Epoll() {
126 }
127 }