Преглед на файлове

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
Christian Grothoff преди 10 години
родител
ревизия
b86f93acaf
променени са 4 файла, в които са добавени 7 реда и са изтрити 2 реда
  1. 1 0
      AUTHORS
  2. 4 0
      ChangeLog
  3. 1 1
      src/include/microhttpd.h
  4. 1 1
      src/microhttpd/daemon.c

+ 1 - 0
AUTHORS

@@ -53,6 +53,7 @@ Hani Benhabiles <[email protected]>
 Guy Martin <[email protected]>
 Robert Groenenberg <[email protected]>
 Denis Dowling <[email protected]>
+Louis Benoit <[email protected]>
 
 
 Documentation contributions also came from:

+ 4 - 0
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

+ 1 - 1
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".

+ 1 - 1
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;
 	  }
       }