From 6b3a770d363bf331306d93dfdf7feacbed0fbb86 Mon Sep 17 00:00:00 2001 From: jow Date: Fri, 6 Jul 2012 17:29:25 +0000 Subject: [package] uhttpd: do not subscribe to epoll write events Watch child read pipe end for data instead of relying on socket write notification to process cgi data, should lower cpu consumption during requests on weaker devices. git-svn-id: svn://svn.openwrt.org/openwrt/trunk/package/uhttpd/src@32640 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- uhttpd.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) (limited to 'uhttpd.c') diff --git a/uhttpd.c b/uhttpd.c index d5d5dfb..73f6e03 100644 --- a/uhttpd.c +++ b/uhttpd.c @@ -219,7 +219,7 @@ static int uh_socket_bind(fd_set *serv_fds, int *max_fd, *max_fd = max(*max_fd, sock); l->fd.cb = uh_listener_cb; - uloop_fd_add(&l->fd, ULOOP_READ | ULOOP_WRITE); + uloop_fd_add(&l->fd, ULOOP_READ); bound++; continue; @@ -539,7 +539,7 @@ static void uh_listener_cb(struct uloop_fd *u, unsigned int events) if ((cl = uh_client_add(new_fd, serv)) != NULL) { /* add client socket to global fdset */ - uloop_fd_add(&cl->fd, ULOOP_READ | ULOOP_WRITE); + uloop_fd_add(&cl->fd, ULOOP_READ); #ifdef HAVE_TLS /* setup client tls context */ @@ -569,6 +569,15 @@ static void uh_listener_cb(struct uloop_fd *u, unsigned int events) } } +static void uh_pipe_cb(struct uloop_fd *u, unsigned int events) +{ + struct client *cl = container_of(u, struct client, pipe); + + D("SRV: Client(%d) pipe(%d) readable\n", cl->fd.fd, cl->pipe.fd); + + uh_client_cb(&cl->fd, ULOOP_WRITE); +} + static void uh_child_cb(struct uloop_process *p, int rv) { struct client *cl = container_of(p, struct client, proc); @@ -686,6 +695,15 @@ static void uh_client_cb(struct uloop_fd *u, unsigned int events) return; } + /* request handler spawned a pipe, register handler */ + if (cl->pipe.fd) + { + D("SRV: Client(%d) pipe(%d) spawned\n", u->fd, cl->pipe.fd); + + cl->pipe.cb = uh_pipe_cb; + uloop_fd_add(&cl->pipe, ULOOP_READ); + } + /* request handler spawned a child, register handler */ if (cl->proc.pid) { @@ -701,7 +719,6 @@ static void uh_client_cb(struct uloop_fd *u, unsigned int events) /* header processing complete */ D("SRV: Client(%d) dispatched\n", u->fd); cl->dispatched = true; - return; } if (!cl->cb(cl)) -- cgit v1.2.1