3 #include "fdevent_impl.h"
11 #ifdef FDEVENT_USE_LINUX_EPOLL
13 # include <sys/epoll.h>
16 static void fdevent_linux_sysepoll_free(fdevents
*ev
) {
18 free(ev
->epoll_events
);
21 static int fdevent_linux_sysepoll_event_del(fdevents
*ev
, fdnode
*fdn
) {
22 return epoll_ctl(ev
->epoll_fd
, EPOLL_CTL_DEL
, fdn
->fd
, NULL
);
25 static int fdevent_linux_sysepoll_event_set(fdevents
*ev
, fdnode
*fdn
, int events
) {
26 int op
= (-1 == fdn
->fde_ndx
) ? EPOLL_CTL_ADD
: EPOLL_CTL_MOD
;
27 int fd
= fdn
->fde_ndx
= fdn
->fd
;
28 struct epoll_event ep
;
30 events
&= ~FDEVENT_RDHUP
;
32 ep
.events
= events
| EPOLLERR
| EPOLLHUP
;
34 return epoll_ctl(ev
->epoll_fd
, op
, fd
, &ep
);
37 static int fdevent_linux_sysepoll_poll(fdevents
* const ev
, int timeout_ms
) {
38 int n
= epoll_wait(ev
->epoll_fd
, ev
->epoll_events
, ev
->maxfds
, timeout_ms
);
39 server
* const srv
= ev
->srv
;
40 for (int i
= 0; i
< n
; ++i
) {
41 fdnode
* const fdn
= (fdnode
*)ev
->epoll_events
[i
].data
.ptr
;
42 int revents
= ev
->epoll_events
[i
].events
;
43 if ((fdevent_handler
)NULL
!= fdn
->handler
) {
44 (*fdn
->handler
)(srv
, fdn
->ctx
, revents
);
51 int fdevent_linux_sysepoll_init(fdevents
*ev
) {
52 force_assert(EPOLLIN
== FDEVENT_IN
);
53 force_assert(EPOLLPRI
== FDEVENT_PRI
);
54 force_assert(EPOLLOUT
== FDEVENT_OUT
);
55 force_assert(EPOLLERR
== FDEVENT_ERR
);
56 force_assert(EPOLLHUP
== FDEVENT_HUP
);
58 force_assert(EPOLLRDHUP
== FDEVENT_RDHUP
);
61 ev
->type
= FDEVENT_HANDLER_LINUX_SYSEPOLL
;
62 ev
->event_set
= fdevent_linux_sysepoll_event_set
;
63 ev
->event_del
= fdevent_linux_sysepoll_event_del
;
64 ev
->poll
= fdevent_linux_sysepoll_poll
;
65 ev
->free
= fdevent_linux_sysepoll_free
;
67 if (-1 == (ev
->epoll_fd
= epoll_create(ev
->maxfds
))) return -1;
69 fdevent_setfd_cloexec(ev
->epoll_fd
);
71 ev
->epoll_events
= malloc(ev
->maxfds
* sizeof(*ev
->epoll_events
));
72 force_assert(NULL
!= ev
->epoll_events
);