7 static int epoll_fd = -1;
9 static int init_event_handler(void)
11 epoll_fd = epoll_create(1);
13 pr_err("Failed to create epoll socket: %m\n");
20 int register_event_handler(struct eventhandler_entry *handler)
22 struct epoll_event ev;
26 ret = init_event_handler();
31 if (handler->fd < 0) {
32 pr_err("Invalid file descriptor of %d for handler %s\n",
33 handler->fd, handler->name);
37 if (!handler->handle_event) {
38 pr_err("Handler %s missing callback function\n", handler->name);
42 pr_debug("Registering handler for \"%s\", fd=%d\n",
43 handler->name, handler->fd);
45 ev.data.fd = handler->fd;
46 ev.data.ptr = handler;
47 ev.events = handler->events;
48 ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, handler->fd, &ev);
50 pr_err("Failed to add epoll_fd: %m\n");
57 int poll_events(int timeout_ms)
59 struct epoll_event event;
60 struct eventhandler_entry *handler;
63 ret = epoll_wait(epoll_fd, &event, 1, timeout_ms);
67 pr_err("epoll_wait: %m\n");
72 * If epoll_wait() was interrupted, better start
73 * everything again from the beginning
79 pr_info("Timed out\n");
83 handler = event.data.ptr;
85 if (!handler || !handler->handle_event) {
86 pr_err("Corrupted event handler for fd %d\n",
91 pr_debug("Running handler %s to handle events from fd %d\n",
92 handler->name, handler->fd);
93 handler->handle_event(handler);