summaryrefslogtreecommitdiff
path: root/poll/unix/epoll.c
diff options
context:
space:
mode:
authorjorton <jorton@13f79535-47bb-0310-9956-ffa450edef68>2005-08-18 21:10:41 +0000
committerjorton <jorton@13f79535-47bb-0310-9956-ffa450edef68>2005-08-18 21:10:41 +0000
commit3672c3fea32f6ef79feef57f753a9a149a6203e3 (patch)
tree83847fa5aa20ffb778189aa4c1182e32645e1944 /poll/unix/epoll.c
parenta783bb74a2a6fa968d423ce8db0f7d7761d9e9d3 (diff)
downloadlibapr-3672c3fea32f6ef79feef57f753a9a149a6203e3.tar.gz
* 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/trunk@233379 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'poll/unix/epoll.c')
-rw-r--r--poll/unix/epoll.c12
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);