libmicrohttpd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[libmicrohttpd] MHD_suspend_connection and MHD_resume_connection with MH


From: Denis Dowling
Subject: [libmicrohttpd] MHD_suspend_connection and MHD_resume_connection with MHD_USE_POLL
Date: Thu, 9 Apr 2015 05:28:51 +0000

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

[Prev in Thread] Current Thread [Next in Thread]