3
int fdevents_init(fdevents *ev, unsigned int max_events) {
5
ev->max_events = max_events;
8
#ifdef HAVE_SYS_EVENT_H
9
if (-1 == (ev->fd = kqueue())) {
10
perror("initializing poll queue");
14
ev->events = malloc(sizeof(struct kevent) * max_events);
16
#elif HAVE_SYS_EPOLL_H
17
if (-1 == (ev->fd = epoll_create(max_events))) {
18
perror("initializing poll queue");
22
if (-1 == (ev->inotify_fd = inotify_init())) {
23
perror("initializing inotify");
27
ev->events = malloc(sizeof(struct epoll_event) * max_events);
30
ev->job_list = malloc(sizeof(fdevent) * max_events);
35
void fdevents_free(fdevents *ev) {
37
#ifdef HAVE_SYS_EPOLL_H
38
close(ev->inotify_fd);
44
int fdevents_poll(fdevents *ev, unsigned int timeout) {
48
ts.tv_sec = timeout / 1000;
49
ts.tv_nsec = (timeout % 1000) * 1000000;
51
#ifdef HAVE_SYS_EVENT_H
52
if (-1 == (ev->event_count = kevent(ev->fd, ev->events, ev->change_count, ev->events, ev->max_events, &ts)) && errno != EINTR)
57
//Populate the joblist
58
for (i = 0;i < ev->event_count;i++) {
59
ev->job_list[i].conn = ev->events[i].udata;
60
ev->job_list[i].fd = ev->events[i].ident;
62
switch (ev->events[i].filter) {
63
case EVFILT_READ: ev->job_list[i].filter = FILTER_READ; break;
64
case EVFILT_WRITE: ev->job_list[i].filter = FILTER_WRITE; break;
65
case EVFILT_VNODE: ev->job_list[i].filter = FILTER_CHANGE; break;
66
default: ev->job_list[i].filter = FILTER_ERROR;
69
#elif HAVE_SYS_EPOLL_H
70
if (-1 == (ev->event_count = epoll_wait(ev->fd, ev->events, ev->max_events, timeout)) && !(errno & EINTR))
73
//Populate the joblist
74
for (i = 0;i < ev->event_count;i++) {
76
ev->job_list[i].conn = ev->events[i].data.ptr;
78
switch (ev->events[i].events) {
79
case EPOLLIN: ev->job_list[i].filter = FILTER_READ; break;
80
case EPOLLOUT: ev->job_list[i].filter = FILTER_WRITE; break;
81
default: ev->job_list[i].filter = FILTER_ERROR;
86
return ev->event_count;
89
int fdevents_add_fd(fdevents *ev, int fd, filter_t filter, void *ptr) {
90
int evfilt, fflags = 0;
92
#ifdef HAVE_SYS_EVENT_H
93
if (filter == FILTER_READ)
95
else if (filter == FILTER_WRITE)
96
evfilt = EVFILT_WRITE;
97
else if (filter == FILTER_CHANGE) {
98
evfilt = EVFILT_VNODE;
99
fflags = NOTE_DELETE | NOTE_WRITE | NOTE_RENAME;
102
EV_SET(&ev->events[ev->change_count], fd, evfilt, EV_ADD, fflags, 0, ptr);
104
#elif HAVE_SYS_EPOLL_H
105
if (filter == FILTER_READ)
107
else if (filter == FILTER_WRITE)
109
else if (filter == FILTER_CHANGE)
112
ev->events[0].events = evfilt;
113
ev->events[0].data.ptr = ptr;
115
if (filter == FILTER_READ)
116
return epoll_ctl(ev->fd, EPOLL_CTL_ADD, fd, &ev->events[0]);
117
else if (filter == FILTER_WRITE)
118
return epoll_ctl(ev->fd, EPOLL_CTL_MOD, fd, &ev->events[0]);
132
fdevents_init(&ev, 10);
134
fd = malloc(sizeof(int) * FD_COUNT);
136
for (i = 0; i < FD_COUNT;i++) {
137
if (-1 == (fd[i] = open("base.h", O_RDONLY))) {
143
fdevents_add_fd(&ev, fd[i], FILTER_READ, NULL);
147
if (-1 == (fdevents_poll(&ev, 5000)))
150
if (ev.event_count > 0)
151
printf("events happened!");
153
for (i = 0; i < FD_COUNT;i++) {
154
if (-1 == (close(fd[i]))) {