libmicrohttpd

HTTP/1.x server C library (MHD 1.x, stable)
Log | Files | Refs | Submodules | README | LICENSE

commit b86f93acaf57b6757daa8e8b0934d2a5bc29bf74
parent 4837ce0471667b4784c1e68693b70032db22a09d
Author: Christian Grothoff <christian@grothoff.org>
Date:   Tue, 14 Apr 2015 22:34:15 +0000

HI,

The MHD goes in a busy loop when it is configured with MHD_USE_POLL_INTERNALLY and a connection times out.
When the connection times out, the connection is closed at connection.c:2646, which sets connection->event_loop_info = MHD_EVENT_LOOP_INFO_CLEANUP.
When the loop info is set to MHD_EVENT_LOOP_INFO_CLEANUP, the main function of the thread loop, MHD_poll_all, never calls back the connection idle callback, which would have cleaned the connection and exit the loop.
I resolved the issue in my development code by adding pos->idle_handler (pos) at daemon.c:2477 in MHD_poll_all (SVN 35533).

The busy loop could be tested using a small enough connection timeout and netcat:
nc -v -w 100 <IP ADDRESS> <IP PORT>

CPU usage will reach 100% in one of the CPU and will remain at that level even when the netcat has closed its end of the connection.

Thanks,

Louis Benoit 


Diffstat:
MAUTHORS | 1+
MChangeLog | 4++++
Msrc/include/microhttpd.h | 2+-
Msrc/microhttpd/daemon.c | 2+-
4 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/AUTHORS b/AUTHORS @@ -53,6 +53,7 @@ Hani Benhabiles <kroosec@gmail.com> Guy Martin <gmsoft@tuxicoman.be> Robert Groenenberg <robert.groenenberg@broadforward.com> Denis Dowling <denis.dowling@hsd.com.au> +Louis Benoit <louisbenoit@videotron.ca> Documentation contributions also came from: diff --git a/ChangeLog b/ChangeLog @@ -1,3 +1,7 @@ +Wed Apr 15 00:30:34 CEST 2015 + Fix looping issue when using MHD_USE_POLL_INTERNALLY + and a client times out. -LB + Sun Apr 12 21:48:50 CEST 2015 Fix looping issue when combining MHD_USE_EPOLL_LINUX_ONLY with HTTPS and slow clients. -CG diff --git a/src/include/microhttpd.h b/src/include/microhttpd.h @@ -130,7 +130,7 @@ typedef intptr_t ssize_t; * Current version of the library. * 0x01093001 = 1.9.30-1. */ -#define MHD_VERSION 0x00094004 +#define MHD_VERSION 0x00094005 /** * MHD-internal return code for "YES". diff --git a/src/microhttpd/daemon.c b/src/microhttpd/daemon.c @@ -2474,7 +2474,7 @@ MHD_poll_all (struct MHD_Daemon *daemon, pos->idle_handler (pos); break; case MHD_EVENT_LOOP_INFO_CLEANUP: - /* should never happen */ + pos->idle_handler (pos); break; } }