Lines 83-89
__attribute__((packed))
Link Here
|
83 |
|
83 |
|
84 |
#define LINUX_MAX_EVENTS (INT_MAX / sizeof(struct epoll_event)) |
84 |
#define LINUX_MAX_EVENTS (INT_MAX / sizeof(struct epoll_event)) |
85 |
|
85 |
|
86 |
static int epoll_to_kevent(struct thread *td, int fd, |
86 |
static int epoll_to_kevent(struct thread *td, struct file *fp, int fd, |
87 |
struct epoll_event *l_event, struct kevent *kevent, |
87 |
struct epoll_event *l_event, struct kevent *kevent, |
88 |
int *nkevents); |
88 |
int *nkevents); |
89 |
static void kevent_to_epoll(struct kevent *kevent, struct epoll_event *l_event); |
89 |
static void kevent_to_epoll(struct kevent *kevent, struct epoll_event *l_event); |
Lines 196-203
linux_epoll_create1(struct thread *td, struct linux_epoll_create1_args *args)
Link Here
|
196 |
|
196 |
|
197 |
/* Structure converting function from epoll to kevent. */ |
197 |
/* Structure converting function from epoll to kevent. */ |
198 |
static int |
198 |
static int |
199 |
epoll_to_kevent(struct thread *td, int fd, struct epoll_event *l_event, |
199 |
epoll_to_kevent(struct thread *td, struct file *fp, int fd, |
200 |
struct kevent *kevent, int *nkevents) |
200 |
struct epoll_event *l_event, struct kevent *kevent, int *nkevents) |
201 |
{ |
201 |
{ |
202 |
uint32_t levents = l_event->events; |
202 |
uint32_t levents = l_event->events; |
203 |
struct linux_pemuldata *pem; |
203 |
struct linux_pemuldata *pem; |
Lines 216-229
epoll_to_kevent(struct thread *td, int fd, struct epoll_event *l_event,
Link Here
|
216 |
|
216 |
|
217 |
/* flags related to what event is registered */ |
217 |
/* flags related to what event is registered */ |
218 |
if ((levents & LINUX_EPOLL_EVRD) != 0) { |
218 |
if ((levents & LINUX_EPOLL_EVRD) != 0) { |
219 |
EV_SET(kevent, fd, EVFILT_READ, kev_flags, 0, 0, 0); |
219 |
EV_SET(kevent, fd, EVFILT_READ, kev_flags, NOTE_HUP, 0, 0); |
220 |
kevent->ext[0] = l_event->data; |
220 |
kevent->ext[0] = l_event->data; |
|
|
221 |
kevent->ext[1] = fp->f_type; |
221 |
++kevent; |
222 |
++kevent; |
222 |
++(*nkevents); |
223 |
++(*nkevents); |
223 |
} |
224 |
} |
224 |
if ((levents & LINUX_EPOLL_EVWR) != 0) { |
225 |
if ((levents & LINUX_EPOLL_EVWR) != 0) { |
225 |
EV_SET(kevent, fd, EVFILT_WRITE, kev_flags, 0, 0, 0); |
226 |
EV_SET(kevent, fd, EVFILT_WRITE, kev_flags, NOTE_HUP, 0, 0); |
226 |
kevent->ext[0] = l_event->data; |
227 |
kevent->ext[0] = l_event->data; |
|
|
228 |
kevent->ext[1] = fp->f_type; |
227 |
++kevent; |
229 |
++kevent; |
228 |
++(*nkevents); |
230 |
++(*nkevents); |
229 |
} |
231 |
} |
Lines 269-283
kevent_to_epoll(struct kevent *kevent, struct epoll_event *l_event)
Link Here
|
269 |
return; |
271 |
return; |
270 |
} |
272 |
} |
271 |
|
273 |
|
272 |
/* XXX EPOLLPRI, EPOLLHUP */ |
274 |
/* XXX EPOLLPRI */ |
273 |
switch (kevent->filter) { |
275 |
switch (kevent->filter) { |
274 |
case EVFILT_READ: |
276 |
case EVFILT_READ: |
275 |
l_event->events = LINUX_EPOLLIN; |
277 |
l_event->events = LINUX_EPOLLIN; |
276 |
if ((kevent->flags & EV_EOF) != 0) |
278 |
if (kevent->ext[1] == DTYPE_SOCKET) { |
277 |
l_event->events |= LINUX_EPOLLRDHUP; |
279 |
if ((kevent->flags & EV_EOF) != 0) |
|
|
280 |
l_event->events |= LINUX_EPOLLRDHUP; |
281 |
if ((kevent->fflags & NOTE_HUP) != 0) |
282 |
l_event->events |= LINUX_EPOLLHUP; |
283 |
} else |
284 |
if ((kevent->flags & EV_EOF) != 0) |
285 |
l_event->events |= LINUX_EPOLLHUP; |
278 |
break; |
286 |
break; |
279 |
case EVFILT_WRITE: |
287 |
case EVFILT_WRITE: |
280 |
l_event->events = LINUX_EPOLLOUT; |
288 |
l_event->events = LINUX_EPOLLOUT; |
|
|
289 |
if (kevent->ext[1] == DTYPE_SOCKET) { |
290 |
if ((kevent->fflags & NOTE_HUP) != 0) |
291 |
l_event->events |= LINUX_EPOLLIN | |
292 |
LINUX_EPOLLHUP | LINUX_EPOLLRDHUP; |
293 |
} else |
294 |
if ((kevent->flags & EV_EOF) != 0) |
295 |
l_event->events |= |
296 |
LINUX_EPOLLIN | LINUX_EPOLLHUP; |
281 |
break; |
297 |
break; |
282 |
} |
298 |
} |
283 |
} |
299 |
} |
Lines 379-385
linux_epoll_ctl(struct thread *td, struct linux_epoll_ctl_args *args)
Link Here
|
379 |
ciargs.changelist = kev; |
395 |
ciargs.changelist = kev; |
380 |
|
396 |
|
381 |
if (args->op != LINUX_EPOLL_CTL_DEL) { |
397 |
if (args->op != LINUX_EPOLL_CTL_DEL) { |
382 |
error = epoll_to_kevent(td, args->fd, &le, kev, &nchanges); |
398 |
error = epoll_to_kevent(td, fp, args->fd, &le, kev, &nchanges); |
383 |
if (error != 0) |
399 |
if (error != 0) |
384 |
goto leave0; |
400 |
goto leave0; |
385 |
} |
401 |
} |