Hi all,

I was trying to use MHD_suspend_connection() and MHD_resume_connection() to 
implement long polling on a request. I am using options 
MHD_USE_SELECT_INTERNALLY and MHD_USE_POLL options. I noticed the server thread 
went to 100% CPU after the first MHD_resume_connection() call. Looking at the 
code in MHD_poll_all() I can see that the file descriptor from daemon->wpipe[0] 
gets inserted into the list of file descriptors to poll but this file 
descriptor is never read so every time this function is called it returns 
immediately. The code works fine if I drop to using just 
MHD_USE_SELECT_INTERNALLY.

The patch below fixes the problem.

Regards,
Denis

Index: src/microhttpd/daemon.c
===================================================================
--- src/microhttpd/daemon.c     (revision 35509)
+++ src/microhttpd/daemon.c  (working copy)
@@ -2317,6 +2317,8 @@
     int timeout;
     unsigned int poll_server;
     int poll_listen;
+    int poll_pipe;
+    char tmp;
     memset (p, 0, sizeof (p));
     poll_server = 0;
@@ -2331,11 +2333,13 @@
               poll_listen = (int) poll_server;
               poll_server++;
       }
+    poll_pipe = -1;
     if (MHD_INVALID_PIPE_ != daemon->wpipe[0])
       {
               p[poll_server].fd = daemon->wpipe[0];
               p[poll_server].events = POLLIN;
               p[poll_server].revents = 0;
+        poll_pipe = (int) poll_server;
               poll_server++;
       }
     if (may_block == MHD_NO)
@@ -2433,6 +2437,11 @@
     if ( (-1 != poll_listen) &&
                (0 != (p[poll_listen].revents & POLLIN)) )
       (void) MHD_accept_connection (daemon);
+
+    /* handle pipe FD */
+    if ( (-1 != poll_pipe) &&
+             (0 != (p[poll_pipe].revents & POLLIN)) )
+      (void) MHD_pipe_read_ (daemon->wpipe[0], &tmp, sizeof (tmp));
   }
   return MHD_YES;
}
________________________________

The information contained in this message and any attachments is strictly 
confidential and intended solely for the use of the intended recipient(s). The 
copyright in this communication belongs to (HSD). This message and any 
attachments are confidential and may be subject to legal or other professional 
privilege. Any confidentiality or privilege is not waived or lost because this 
e-mail has been sent to you by mistake. If you have received this transmission 
in error, please notify HSD on +61 3 9875 5900 immediately and destroy all 
copies of this e-mail. The contents of this email message may not be quoted, 
copied, reproduced or published in part or in whole, without the written 
authorisation of HSD.

Reply via email to