X-Git-Url: http://git.archive.openwrt.org/?p=project%2Flibubox.git;a=blobdiff_plain;f=uloop.c;fp=uloop.c;h=d2784b772bb490ffefd348aa1ee341ff6833d07a;hp=f2eb50a64a32a835e83210a35110311ad46eb89f;hb=8ae74b4378827d48f655c509d786a6e054e9d0b2;hpb=4b0aa9ccc22eff62e177b9777152e7937273b418;ds=sidebyside diff --git a/uloop.c b/uloop.c index f2eb50a..d2784b7 100644 --- a/uloop.c +++ b/uloop.c @@ -68,98 +68,7 @@ static int cur_fd, cur_nfds; #endif #ifdef USE_EPOLL - -/** - * FIXME: uClibc < 0.9.30.3 does not define EPOLLRDHUP for Linux >= 2.6.17 - */ -#ifndef EPOLLRDHUP -#define EPOLLRDHUP 0x2000 -#endif - -int uloop_init(void) -{ - if (poll_fd >= 0) - return 0; - - poll_fd = epoll_create(32); - if (poll_fd < 0) - return -1; - - fcntl(poll_fd, F_SETFD, fcntl(poll_fd, F_GETFD) | FD_CLOEXEC); - return 0; -} - -static int register_poll(struct uloop_fd *fd, unsigned int flags) -{ - struct epoll_event ev; - int op = fd->registered ? EPOLL_CTL_MOD : EPOLL_CTL_ADD; - - memset(&ev, 0, sizeof(struct epoll_event)); - - if (flags & ULOOP_READ) - ev.events |= EPOLLIN | EPOLLRDHUP; - - if (flags & ULOOP_WRITE) - ev.events |= EPOLLOUT; - - if (flags & ULOOP_EDGE_TRIGGER) - ev.events |= EPOLLET; - - ev.data.fd = fd->fd; - ev.data.ptr = fd; - fd->flags = flags; - - return epoll_ctl(poll_fd, op, fd->fd, &ev); -} - -static struct epoll_event events[ULOOP_MAX_EVENTS]; - -static int __uloop_fd_delete(struct uloop_fd *sock) -{ - sock->flags = 0; - return epoll_ctl(poll_fd, EPOLL_CTL_DEL, sock->fd, 0); -} - -static int uloop_fetch_events(int timeout) -{ - int n, nfds; - - nfds = epoll_wait(poll_fd, events, ARRAY_SIZE(events), timeout); - for (n = 0; n < nfds; ++n) { - struct uloop_fd_event *cur = &cur_fds[n]; - struct uloop_fd *u = events[n].data.ptr; - unsigned int ev = 0; - - cur->fd = u; - if (!u) - continue; - - if (events[n].events & (EPOLLERR|EPOLLHUP)) { - u->error = true; - if (!(u->flags & ULOOP_ERROR_CB)) - uloop_fd_delete(u); - } - - if(!(events[n].events & (EPOLLRDHUP|EPOLLIN|EPOLLOUT|EPOLLERR|EPOLLHUP))) { - cur->fd = NULL; - continue; - } - - if(events[n].events & EPOLLRDHUP) - u->eof = true; - - if(events[n].events & EPOLLIN) - ev |= ULOOP_READ; - - if(events[n].events & EPOLLOUT) - ev |= ULOOP_WRITE; - - cur->events = ev; - } - - return nfds; -} - +#include "uloop-epoll.c" #endif static bool uloop_fd_stack_event(struct uloop_fd *fd, int events)