6 #include <sys/socket.h>
12 struct wl_event_loop {
14 wl_event_loop_idle_func_t idle_func;
18 struct wl_event_source {
20 wl_event_loop_fd_func_t func;
24 struct wl_event_source *
25 wl_event_loop_add_fd(struct wl_event_loop *loop,
26 int fd, uint32_t mask,
27 wl_event_loop_fd_func_t func,
30 struct wl_event_source *source;
31 struct epoll_event ep;
33 source = malloc(sizeof *source);
42 if (mask & WL_EVENT_READABLE)
44 if (mask & WL_EVENT_WRITEABLE)
45 ep.events |= EPOLLOUT;
48 if (epoll_ctl(loop->epoll_fd, EPOLL_CTL_ADD, fd, &ep) < 0) {
56 struct wl_event_source idle_source;
59 wl_event_loop_remove_source(struct wl_event_loop *loop,
60 struct wl_event_source *source)
64 if (source == &idle_source) {
65 loop->idle_func = NULL;
70 return epoll_ctl(loop->epoll_fd,
71 EPOLL_CTL_DEL, fd, NULL);
76 wl_event_loop_update_source(struct wl_event_loop *loop,
77 struct wl_event_source *source,
80 struct epoll_event ep;
83 if (mask & WL_EVENT_READABLE)
85 if (mask & WL_EVENT_WRITEABLE)
86 ep.events |= EPOLLOUT;
89 return epoll_ctl(loop->epoll_fd,
90 EPOLL_CTL_MOD, source->fd, &ep);
93 struct wl_event_loop *
94 wl_event_loop_create(void)
96 struct wl_event_loop *loop;
98 loop = malloc(sizeof *loop);
102 loop->epoll_fd = epoll_create(16);
103 if (loop->epoll_fd < 0) {
112 wl_event_loop_destroy(struct wl_event_loop *loop)
114 close(loop->epoll_fd);
118 struct wl_event_source *
119 wl_event_loop_add_idle(struct wl_event_loop *loop,
120 wl_event_loop_idle_func_t func,
123 loop->idle_func = func;
124 loop->idle_data = data;
129 #define ARRAY_LENGTH(a) (sizeof (a) / sizeof (a)[0])
132 wl_event_loop_wait(struct wl_event_loop *loop)
134 struct epoll_event ep[32];
135 struct wl_event_source *source;
136 int i, count, timeout;
144 count = epoll_wait(loop->epoll_fd, ep, ARRAY_LENGTH(ep), timeout);
148 for (i = 0; i < count; i++) {
149 source = ep[i].data.ptr;
151 if (ep[i].events & EPOLLIN)
152 mask |= WL_EVENT_READABLE;
153 if (ep[i].events & EPOLLOUT)
154 mask |= WL_EVENT_WRITEABLE;
156 source->func(source->fd, mask, source->data);
159 if (count == 0 && loop->idle_func != NULL) {
160 loop->idle_func(loop->idle_data);
161 loop->idle_func = NULL;