diff options
author | jorton <jorton@13f79535-47bb-0310-9956-ffa450edef68> | 2005-09-09 08:40:16 +0000 |
---|---|---|
committer | jorton <jorton@13f79535-47bb-0310-9956-ffa450edef68> | 2005-09-09 08:40:16 +0000 |
commit | a9c49a958176d52a0d193565995d1b436411ffc1 (patch) | |
tree | a4056d5853b787a4475a88b2fe4b3d0e8d0a596d | |
parent | 28a9d460fe6b464a0122534ecdcff34f785b087b (diff) | |
download | libapr-a9c49a958176d52a0d193565995d1b436411ffc1.tar.gz |
Merge r233379 from trunk:
* poll/unix/epoll.c (apr_pollset_create): Check for errors from
epoll_create(). Don't leak the epoll fd to spawned children; do
register the cleanup as a child_cleanup too. Remove a cast to void *.
git-svn-id: http://svn.apache.org/repos/asf/apr/apr/branches/1.2.x@279731 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | poll/unix/epoll.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/poll/unix/epoll.c b/poll/unix/epoll.c index 30b30dcd8..5d683cbd8 100644 --- a/poll/unix/epoll.c +++ b/poll/unix/epoll.c @@ -91,6 +91,13 @@ APR_DECLARE(apr_status_t) apr_pollset_create(apr_pollset_t **pollset, apr_uint32_t flags) { apr_status_t rv; + int fd; + + fd = epoll_create(size); + if (fd < 0) { + *pollset = NULL; + return errno; + } *pollset = apr_palloc(p, sizeof(**pollset)); #if APR_HAS_THREADS @@ -111,10 +118,9 @@ APR_DECLARE(apr_status_t) apr_pollset_create(apr_pollset_t **pollset, (*pollset)->nalloc = size; (*pollset)->flags = flags; (*pollset)->pool = p; - (*pollset)->epoll_fd = epoll_create(size); + (*pollset)->epoll_fd = fd; (*pollset)->pollset = apr_palloc(p, size * sizeof(struct epoll_event)); - apr_pool_cleanup_register(p, (void *) (*pollset), backend_cleanup, - apr_pool_cleanup_null); + apr_pool_cleanup_register(p, *pollset, backend_cleanup, backend_cleanup); (*pollset)->result_set = apr_palloc(p, size * sizeof(apr_pollfd_t)); APR_RING_INIT(&(*pollset)->query_ring, pfd_elem_t, link); |