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.IoOps;
19
20
21
22
23 public final class EpollIoOps implements IoOps {
24
25 static {
26
27
28 Epoll.ensureAvailability();
29 }
30
31
32
33
34
35 public static final EpollIoOps EPOLLOUT = new EpollIoOps(Native.EPOLLOUT);
36
37
38
39
40 public static final EpollIoOps EPOLLIN = new EpollIoOps(Native.EPOLLIN);
41
42
43
44
45 public static final EpollIoOps EPOLLERR = new EpollIoOps(Native.EPOLLERR);
46
47
48
49
50 public static final EpollIoOps EPOLLRDHUP = new EpollIoOps(Native.EPOLLRDHUP);
51
52 public static final EpollIoOps EPOLLET = new EpollIoOps(Native.EPOLLET);
53
54
55
56
57
58 public static final EpollIoOps NONE = new EpollIoOps(0);
59
60 static final int EPOLL_ERR_OUT_MASK = EpollIoOps.EPOLLERR.value | EpollIoOps.EPOLLOUT.value;
61 static final int EPOLL_ERR_IN_MASK = EpollIoOps.EPOLLERR.value | EpollIoOps.EPOLLIN.value;
62 static final int EPOLL_RDHUP_MASK = EpollIoOps.EPOLLRDHUP.value;
63
64
65 private static final EpollIoEvent[] EVENTS;
66
67 static {
68 EpollIoOps all = new EpollIoOps(EPOLLOUT.value | EPOLLIN.value | EPOLLERR.value | EPOLLRDHUP.value);
69 EVENTS = new EpollIoEvent[all.value + 2];
70 addToArray(EVENTS, NONE);
71 addToArray(EVENTS, EPOLLOUT);
72 addToArray(EVENTS, EPOLLIN);
73 addToArray(EVENTS, EPOLLERR);
74 addToArray(EVENTS, EPOLLRDHUP);
75 addToArray(EVENTS, all);
76 }
77
78 private static void addToArray(EpollIoEvent[] array, EpollIoOps ops) {
79 array[ops.value] = new DefaultEpollIoEvent(ops);
80 }
81
82 final int value;
83
84 private EpollIoOps(int value) {
85 this.value = value;
86 }
87
88
89
90
91
92
93 public boolean contains(EpollIoOps ops) {
94 return (value & ops.value) != 0;
95 }
96
97 boolean contains(int value) {
98 return (this.value & value) != 0;
99 }
100
101
102
103
104
105
106
107 public EpollIoOps with(EpollIoOps ops) {
108 if (contains(ops)) {
109 return this;
110 }
111 return valueOf(value | ops.value());
112 }
113
114
115
116
117
118
119
120 public EpollIoOps without(EpollIoOps ops) {
121 if (!contains(ops)) {
122 return this;
123 }
124 return valueOf(value & ~ops.value());
125 }
126
127
128
129
130
131
132 public int value() {
133 return value;
134 }
135
136 @Override
137 public boolean equals(Object o) {
138 if (this == o) {
139 return true;
140 }
141 if (o == null || getClass() != o.getClass()) {
142 return false;
143 }
144 EpollIoOps nioOps = (EpollIoOps) o;
145 return value == nioOps.value;
146 }
147
148 @Override
149 public int hashCode() {
150 return value;
151 }
152
153
154
155
156
157
158
159 public static EpollIoOps valueOf(int value) {
160 return eventOf(value).ops();
161 }
162
163 @Override
164 public String toString() {
165 return "EpollIoOps{" +
166 "value=" + value +
167 '}';
168 }
169
170 static EpollIoEvent eventOf(int value) {
171 if (value > 0 && value < EVENTS.length) {
172 EpollIoEvent event = EVENTS[value];
173 if (event != null) {
174 return event;
175 }
176 }
177 return new DefaultEpollIoEvent(new EpollIoOps(value));
178 }
179
180 private static final class DefaultEpollIoEvent implements EpollIoEvent {
181 private final EpollIoOps ops;
182
183 DefaultEpollIoEvent(EpollIoOps ops) {
184 this.ops = ops;
185 }
186
187 @Override
188 public EpollIoOps ops() {
189 return ops;
190 }
191
192 @Override
193 public boolean equals(Object o) {
194 if (this == o) {
195 return true;
196 }
197 if (o == null || getClass() != o.getClass()) {
198 return false;
199 }
200 EpollIoEvent event = (EpollIoEvent) o;
201 return event.ops().equals(ops());
202 }
203
204 @Override
205 public int hashCode() {
206 return ops().hashCode();
207 }
208
209 @Override
210 public String toString() {
211 return "DefaultEpollIoEvent{" +
212 "ops=" + ops +
213 '}';
214 }
215 }
216 }