2 #include <aura/private.h>
6 #include <sys/eventfd.h>
8 struct aura_epoll_data {
10 struct aura_pollfds evtfd;
14 void *aura_eventsys_backend_create(
void *loopdata)
16 struct aura_epoll_data *epd = calloc(1,
sizeof(*epd));
19 epd->loopdata = loopdata;
20 epd->epollfd = epoll_create(7);
26 epd->evtfd.fd = eventfd(0, EFD_NONBLOCK);
27 epd->evtfd.events = EPOLLIN;
28 if (-1 == epd->evtfd.fd)
31 aura_eventsys_backend_fd_action(epd, &epd->evtfd, AURA_FD_ADDED);
41 void aura_eventsys_backend_destroy(
void *backend)
43 struct aura_epoll_data *epd = backend;
49 void aura_eventsys_backend_fd_action(
void *backend,
const struct aura_pollfds *ap,
int action)
51 struct aura_node *node = ap->node;
52 struct epoll_event ev;
53 struct aura_epoll_data *epd = backend;
54 ((
struct aura_pollfds *)ap)->magic = 0xdeadbeaf;
56 int op = (action == AURA_FD_ADDED) ? EPOLL_CTL_ADD : EPOLL_CTL_DEL;
57 slog(4, SLOG_DEBUG,
"epoll: Descriptor %d %s to/from epoll",
58 ap->fd, (action == AURA_FD_ADDED) ?
"added" :
"removed");
59 ev.events = ap->events;
60 ev.data.ptr = (
void *) ap;
61 ret = epoll_ctl(epd->epollfd, op, ap->fd, &ev);
63 BUG(node,
"Event System failed to add/remove a descriptor");
67 int aura_eventsys_backend_wait(
void *backend,
int timeout_ms)
69 struct aura_epoll_data *epd = backend;
70 struct epoll_event ev[NUM_EVTS];
72 int ret = epoll_wait(epd->epollfd, ev, NUM_EVTS, timeout_ms);
74 slog(4, SLOG_LIVE,
"epoll: reported %d events", ret);
76 slog(0, SLOG_ERROR,
"epoll: returned -1: %s", strerror(errno));
81 for (i = 0; i< ret; i++) {
82 struct aura_pollfds *ap;
84 if (ap == &epd->evtfd) {
88 read(epd->evtfd.fd, &tmp,
sizeof(uint64_t));
90 ap->events = ev[i].events;
92 slog(4, SLOG_LIVE,
"events: %s %s %s",
93 (ev[i].events & EPOLLIN) ?
"IN" :
"",
94 (ev[i].events & EPOLLOUT) ?
"OUT" :
"",
95 (ev[i].events & EPOLLPRI) ?
"PRI" :
""
98 aura_eventloop_report_event(epd->loopdata, ap);
103 void aura_eventsys_backend_interrupt(
void *backend)
105 struct aura_epoll_data *epd = backend;
107 write(epd->evtfd.fd, &tmp,
sizeof(uint64_t));