[Top][All Lists]

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

Re: [libmicrohttpd] Select timeout being set to 0

From: Christian Grothoff
Subject: Re: [libmicrohttpd] Select timeout being set to 0
Date: Fri, 28 Oct 2011 18:14:15 +0200
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv: Gecko/20111004 Icedove/3.0.11

Dear Jon,

I've tried (and failed) to reproduce your problem. I've attached my modified version of 'minimal_example.c' (modified to use a thread pool). When I connect to the server with firefox, the socket stays open (will be re-used by the browser) but MHD does NOT use any CPU after the page is served initially.

I do recall a bugs that could cause similar behavior of MHD looping in older MHD versions (prior to 4.5) and there was also a bug with looping for up to 1s before 0.9.12. Which MHD version are you using? (We're currently at 0.9.15, another release might happen later this weekend.)

Happy hacking!


On 10/27/2011 10:07 PM, Jon Nalley wrote:

I am seeing some odd behavior when using MHD_USE_SELECT_INTERNALLY +

When a request is handled, my CPU usage goes to 100% (I am running on a
PowerPC 405ex - Linux+uClibc).

I was able to determine that MHD_select() in src/daemon/daemon.c is setting
the select timeout to 0.

The following check is true, and ltimeout is 0 which causes the timeout
passed to select() to be 0.

else if ( (0 == (daemon->options&  MHD_USE_THREAD_PER_CONNECTION))&&
             (MHD_YES == MHD_get_timeout (daemon,&ltimeout)) )

+ MHD_OPTION_THREAD_POOL_SIZE I do *NOT* see the issue.

I took a look at MHD_get_timeout() and noticed I am hitting the following:

if (earliest_deadline<  now)
     *timeout = 0;

I also confirmed that if I close my browser, the connections are closed and
the select() is once again called with a NULL timeout (blocking forever).

I am not sure exactly what is going on here.  It seems like the browser (I
tested with Chrome and Firefox) is keeping the connection open, which causes
MHD_get_timeout() to return MHD_YES (and set ltimeout = 0 in MHD_select())
which results in my process effectively entering a "busy loop" calling
select with a timeout of 0 repeatedly.  The page has been fully loaded by
the browser, so I am not sure why the connections remain "ESTABLISHED" (as
reported by netstat -atn).  Perhaps the browser keeps the connections open
in order to speed up subsequent requests?

I would appreciate any feedback as to what I may be overlooking and how I
can resolve this issue.


Jon Nalley

Attachment: minimal_example.c
Description: Text Data

reply via email to

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