diff options
author | (no author) <(no author)@13f79535-47bb-0310-9956-ffa450edef68> | 2004-07-07 15:47:09 +0000 |
---|---|---|
committer | (no author) <(no author)@13f79535-47bb-0310-9956-ffa450edef68> | 2004-07-07 15:47:09 +0000 |
commit | c78c55e44408c9f47c957789d33c8033054e6c73 (patch) | |
tree | 5a688b74bb444d61d4b7cc2211d3c74de3b1b69d /poll/unix/poll.c | |
parent | 187e4d71342faa6696fb00e4c04212704e88ee80 (diff) | |
download | libapr-c78c55e44408c9f47c957789d33c8033054e6c73.tar.gz |
This commit was manufactured by cvs2svn to create tagAPR_1_0_0_RC3
'APR_1_0_0_RC3'.
git-svn-id: http://svn.apache.org/repos/asf/apr/apr/tags/APR_1_0_0_RC3@65267 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'poll/unix/poll.c')
-rw-r--r-- | poll/unix/poll.c | 371 |
1 files changed, 11 insertions, 360 deletions
diff --git a/poll/unix/poll.c b/poll/unix/poll.c index a04866fcd..c792d0a65 100644 --- a/poll/unix/poll.c +++ b/poll/unix/poll.c @@ -26,77 +26,12 @@ #include <sys/poll.h> #endif -#ifdef HAVE_KQUEUE -#include <sys/types.h> -#include <sys/event.h> -#include <sys/time.h> -#endif - -#ifdef HAVE_EPOLL -#include <sys/epoll.h> -#endif #ifdef NETWARE #define HAS_SOCKETS(dt) (dt == APR_POLL_SOCKET) ? 1 : 0 #define HAS_PIPES(dt) (dt == APR_POLL_FILE) ? 1 : 0 #endif -#ifdef HAVE_KQUEUE -static apr_int16_t get_kqueue_revent(apr_int16_t event, apr_int16_t flags) -{ - apr_int16_t rv = 0; - - if (event & EVFILT_READ) - rv |= APR_POLLIN; - if (event & EVFILT_WRITE) - rv |= APR_POLLOUT; - if (flags & EV_ERROR || flags & EV_EOF) - rv |= APR_POLLERR; - - return rv; -} - -#endif - -#ifdef HAVE_EPOLL -static apr_int16_t get_epoll_event(apr_int16_t event) -{ - apr_int16_t rv = 0; - - if (event & APR_POLLIN) - rv |= EPOLLIN; - if (event & APR_POLLPRI) - rv |= EPOLLPRI; - if (event & APR_POLLOUT) - rv |= EPOLLOUT; - if (event & APR_POLLERR) - rv |= EPOLLERR; - if (event & APR_POLLHUP) - rv |= EPOLLHUP; - /* APR_POLLNVAL is not handled by epoll. */ - - return rv; -} - -static apr_int16_t get_epoll_revent(apr_int16_t event) -{ - apr_int16_t rv = 0; - - if (event & EPOLLIN) - rv |= APR_POLLIN; - if (event & EPOLLPRI) - rv |= APR_POLLPRI; - if (event & EPOLLOUT) - rv |= APR_POLLOUT; - if (event & EPOLLERR) - rv |= APR_POLLERR; - if (event & EPOLLHUP) - rv |= APR_POLLHUP; - /* APR_POLLNVAL is not handled by epoll. */ - - return rv; -} -#endif #ifdef HAVE_POLL /* We can just use poll to do our socket polling. */ @@ -349,18 +284,9 @@ APR_DECLARE(apr_status_t) apr_poll(apr_pollfd_t *aprset, int num, apr_int32_t *n #endif struct apr_pollset_t { - apr_pool_t *pool; - apr_uint32_t nelts; apr_uint32_t nalloc; -#ifdef HAVE_KQUEUE - int kqueue_fd; - struct kevent kevent; - struct kevent *ke_set; -#elif defined(HAVE_EPOLL) - int epoll_fd; - struct epoll_event *pollset; -#elif defined(HAVE_POLL) +#ifdef HAVE_POLL struct pollfd *pollset; #else fd_set readset, writeset, exceptset; @@ -374,25 +300,12 @@ struct apr_pollset_t { #endif }; -#if defined(HAVE_KQUEUE) || defined(HAVE_EPOLL) -static apr_status_t backend_cleanup(void *p_) -{ - apr_pollset_t *pollset = (apr_pollset_t *)p_; -#ifdef HAVE_KQUEUE - close(pollset->kqueue_fd); -#elif defined(HAVE_EPOLL) - close(pollset->epoll_fd); -#endif - return APR_SUCCESS; -} -#endif /* HAVE_KQUEUE || HAVE_EPOLL */ - APR_DECLARE(apr_status_t) apr_pollset_create(apr_pollset_t **pollset, apr_uint32_t size, apr_pool_t *p, apr_uint32_t flags) { -#if !defined(HAVE_KQUEUE) && !defined(HAVE_EPOLL) && !defined(HAVE_POLL) && defined(FD_SETSIZE) +#if !defined(HAVE_POLL) && defined(FD_SETSIZE) if (size > FD_SETSIZE) { *pollset = NULL; return APR_EINVAL; @@ -401,22 +314,7 @@ APR_DECLARE(apr_status_t) apr_pollset_create(apr_pollset_t **pollset, *pollset = apr_palloc(p, sizeof(**pollset)); (*pollset)->nelts = 0; (*pollset)->nalloc = size; - (*pollset)->pool = p; -#ifdef HAVE_KQUEUE - (*pollset)->ke_set = (struct kevent*)apr_palloc(p, size * sizeof(struct kevent)); - memset((*pollset)->ke_set, 0, size * sizeof(struct kevent)); - (*pollset)->kqueue_fd = kqueue(); - if ((*pollset)->kqueue_fd == -1) { - return APR_ENOMEM; - } - apr_pool_cleanup_register(p, (void*)(*pollset), backend_cleanup, - apr_pool_cleanup_null); -#elif defined(HAVE_EPOLL) - (*pollset)->epoll_fd = epoll_create(size); - (*pollset)->pollset = apr_palloc(p, size * sizeof(struct epoll_event)); - apr_pool_cleanup_register(p, (void*)(*pollset), backend_cleanup, - apr_pool_cleanup_null); -#elif defined(HAVE_POLL) +#ifdef HAVE_POLL (*pollset)->pollset = apr_palloc(p, size * sizeof(struct pollfd)); #else FD_ZERO(&((*pollset)->readset)); @@ -435,75 +333,25 @@ APR_DECLARE(apr_status_t) apr_pollset_create(apr_pollset_t **pollset, APR_DECLARE(apr_status_t) apr_pollset_destroy(apr_pollset_t *pollset) { -#if defined(HAVE_KQUEUE) || defined(HAVE_EPOLL) - return apr_pool_cleanup_run(pollset->pool, pollset, backend_cleanup); -#else + /* A no-op function for now. If we later implement /dev/poll + * support, we'll need to close the /dev/poll fd here + */ return APR_SUCCESS; -#endif } APR_DECLARE(apr_status_t) apr_pollset_add(apr_pollset_t *pollset, const apr_pollfd_t *descriptor) { -#ifdef HAVE_KQUEUE - apr_os_sock_t fd; -#elif defined(HAVE_EPOLL) - struct epoll_event ev; - int ret = -1; -#else -#if !defined(HAVE_POLL) +#ifndef HAVE_POLL apr_os_sock_t fd; #endif -#endif if (pollset->nelts == pollset->nalloc) { return APR_ENOMEM; } pollset->query_set[pollset->nelts] = *descriptor; - -#ifdef HAVE_KQUEUE - if (descriptor->desc_type == APR_POLL_SOCKET) { - fd = descriptor->desc.s->socketdes; - } - else { - fd = descriptor->desc.f->filedes; - } - - if (descriptor->reqevents & APR_POLLIN) { - EV_SET(&pollset->kevent, fd, EVFILT_READ, EV_ADD, 0, 0, NULL); - - if (kevent(pollset->kqueue_fd, &pollset->kevent, 1, NULL, 0, - NULL) == -1) { - return APR_ENOMEM; - } - } - - if (descriptor->reqevents & APR_POLLOUT) { - EV_SET(&pollset->kevent, fd, EVFILT_WRITE, EV_ADD, 0, 0, NULL); - - if (kevent(pollset->kqueue_fd, &pollset->kevent, 1, NULL, 0, - NULL) == -1) { - return APR_ENOMEM; - } - } - -#elif defined(HAVE_EPOLL) - ev.events = get_epoll_event(descriptor->reqevents); - if (descriptor->desc_type == APR_POLL_SOCKET) { - ev.data.fd = descriptor->desc.s->socketdes; - ret = epoll_ctl(pollset->epoll_fd, EPOLL_CTL_ADD, - descriptor->desc.s->socketdes, &ev); - } - else { - ev.data.fd = descriptor->desc.f->filedes; - ret = epoll_ctl(pollset->epoll_fd, EPOLL_CTL_ADD, - descriptor->desc.f->filedes, &ev); - } - if (0 != ret) { - return APR_EBADF; - } -#elif defined(HAVE_POLL) +#ifdef HAVE_POLL if (descriptor->desc_type == APR_POLL_SOCKET) { pollset->pollset[pollset->nelts].fd = descriptor->desc.s->socketdes; @@ -572,97 +420,11 @@ APR_DECLARE(apr_status_t) apr_pollset_remove(apr_pollset_t *pollset, const apr_pollfd_t *descriptor) { apr_uint32_t i; -#ifdef HAVE_KQUEUE - apr_os_sock_t fd; -#elif defined(HAVE_EPOLL) - struct epoll_event ev; - int ret = -1; -#elif !defined(HAVE_POLL) +#ifndef HAVE_POLL apr_os_sock_t fd; #endif -#ifdef HAVE_KQUEUE - for (i = 0; i < pollset->nelts; i++) { - if (descriptor->desc.s == pollset->query_set[i].desc.s) { - /* Found an instance of the fd: remove this and any other copies */ - apr_uint32_t dst = i; - apr_uint32_t old_nelts = pollset->nelts; - pollset->nelts--; - for (i++; i < old_nelts; i++) { - if (descriptor->desc.s == pollset->query_set[i].desc.s) { - pollset->nelts--; - } - else { - pollset->query_set[dst] = pollset->query_set[i]; - dst++; - } - } - - if (descriptor->desc_type == APR_POLL_SOCKET) { - fd = descriptor->desc.s->socketdes; - } - else { - fd = descriptor->desc.f->filedes; - } - - if (descriptor->reqevents & APR_POLLIN) { - EV_SET(&pollset->kevent, fd, - EVFILT_READ, EV_DELETE, 0, 0, NULL); - - if (kevent(pollset->kqueue_fd, &pollset->kevent, 1, NULL, 0, - NULL) == -1) { - return APR_EBADF; - } - } - - if (descriptor->reqevents & APR_POLLOUT) { - EV_SET(&pollset->kevent, fd, - EVFILT_WRITE, EV_DELETE, 0, 0, NULL); - - if (kevent(pollset->kqueue_fd, &pollset->kevent, 1, NULL, 0, - NULL) == -1) { - return APR_EBADF; - } - } - - return APR_SUCCESS; - } - } -#elif defined(HAVE_EPOLL) - for (i = 0; i < pollset->nelts; i++) { - if (descriptor->desc.s == pollset->query_set[i].desc.s) { - /* Found an instance of the fd: remove this and any other copies */ - apr_uint32_t dst = i; - apr_uint32_t old_nelts = pollset->nelts; - pollset->nelts--; - for (i++; i < old_nelts; i++) { - if (descriptor->desc.s == pollset->query_set[i].desc.s) { - pollset->nelts--; - } - else { - pollset->query_set[dst] = pollset->query_set[i]; - dst++; - } - } - ev.events = get_epoll_event(descriptor->reqevents); - if (descriptor->desc_type == APR_POLL_SOCKET) { - ev.data.fd = descriptor->desc.s->socketdes; - ret = epoll_ctl(pollset->epoll_fd, EPOLL_CTL_DEL, - descriptor->desc.s->socketdes, &ev); - } - else { - ev.data.fd = descriptor->desc.f->filedes; - ret = epoll_ctl(pollset->epoll_fd, EPOLL_CTL_DEL, - descriptor->desc.f->filedes, &ev); - } - if (ret < 0) { - return APR_EBADF; - } - - return APR_SUCCESS; - } - } -#elif defined(HAVE_POLL) +#ifdef HAVE_POLL for (i = 0; i < pollset->nelts; i++) { if (descriptor->desc.s == pollset->query_set[i].desc.s) { /* Found an instance of the fd: remove this and any other copies */ @@ -723,119 +485,8 @@ APR_DECLARE(apr_status_t) apr_pollset_remove(apr_pollset_t *pollset, return APR_NOTFOUND; } -#ifdef HAVE_KQUEUE -APR_DECLARE(apr_status_t) apr_pollset_poll(apr_pollset_t *pollset, - apr_interval_time_t timeout, - apr_int32_t *num, - const apr_pollfd_t **descriptors) -{ - int rv; - apr_uint32_t i, j, r = 0; - struct timespec tv, *tvptr; - - if (timeout < 0) { - tvptr = NULL; - } - else { - tv.tv_sec = (long)apr_time_sec(timeout); - tv.tv_nsec = (long)apr_time_msec(timeout); - tvptr = &tv; - } - - rv = kevent(pollset->kqueue_fd, NULL, 0, pollset->ke_set, pollset->nelts, - tvptr); - (*num) = rv; - if (rv < 0) { - return apr_get_netos_error(); - } - if (rv == 0) { - return APR_TIMEUP; - } - - /* TODO: Is there a better way to re-associate our data? */ - for (i = 0; i < pollset->nelts; i++) { - apr_os_sock_t fd; - if (pollset->query_set[i].desc_type == APR_POLL_SOCKET) { - fd = pollset->query_set[i].desc.s->socketdes; - } - else { - fd = pollset->query_set[i].desc.f->filedes; - } - for (j = 0; j < rv; j++) { - if (pollset->ke_set[j].ident == fd ) { - pollset->result_set[r] = pollset->query_set[i]; - pollset->result_set[r].rtnevents = - get_kqueue_revent(pollset->ke_set[j].filter, - pollset->ke_set[j].flags); - r++; - } - } - } - - (*num) = r; - - if (descriptors) { - *descriptors = pollset->result_set; - } - - return APR_SUCCESS; -} - -#elif defined(HAVE_EPOLL) - -APR_DECLARE(apr_status_t) apr_pollset_poll(apr_pollset_t *pollset, - apr_interval_time_t timeout, - apr_int32_t *num, - const apr_pollfd_t **descriptors) -{ - int rv; - apr_uint32_t i, j, k; - - if (timeout > 0) { - timeout /= 1000; - } - rv = epoll_wait(pollset->epoll_fd, pollset->pollset, pollset->nelts, - timeout); - (*num) = rv; - if (rv < 0) { - return apr_get_netos_error(); - } - if (rv == 0) { - return APR_TIMEUP; - } - j = 0; - for (i = 0; i < pollset->nelts; i++) { - if (pollset->pollset[i].events != 0) { - /* TODO: Is there a better way to re-associate our data? */ - for (k = 0; k < pollset->nelts; k++) { - if (pollset->query_set[k].desc_type == APR_POLL_SOCKET && - pollset->query_set[k].desc.s->socketdes == - pollset->pollset[i].data.fd) { - pollset->result_set[j] = pollset->query_set[k]; - pollset->result_set[j].rtnevents = - get_epoll_revent(pollset->pollset[i].events); - j++; - break; - } - else if (pollset->query_set[k].desc_type == APR_POLL_FILE - && pollset->query_set[k].desc.f->filedes == - pollset->pollset[i].data.fd) { - pollset->result_set[j] = pollset->query_set[k]; - pollset->result_set[j].rtnevents = - get_epoll_revent(pollset->pollset[i].events); - j++; - break; - } - } - } - } - if (descriptors) { - *descriptors = pollset->result_set; - } - return APR_SUCCESS; -} -#elif defined(HAVE_POLL) +#ifdef HAVE_POLL APR_DECLARE(apr_status_t) apr_pollset_poll(apr_pollset_t *pollset, apr_interval_time_t timeout, apr_int32_t *num, |