apr-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Eric van der Maarel <eric.vandermaa...@nedap.com>
Subject Re: 100% cpu with APR on Windows
Date Thu, 07 Jul 2011 13:41:52 GMT
On 07/06/2011 03:58 PM, Mladen Turk wrote:
> On 07/06/2011 02:52 PM, Eric van der Maarel wrote:
>> Hi,
>>
>> Recently I proposed a fix for the select version of apr_pollset_poll
>> implementation, that prevents cpu going to 100% when all clients have
>> disconnected
>> (http://mail-archives.apache.org/mod_mbox/apr-dev/201106.mbox/browser). It actually
provides the select impl. of poll with the ability to issue APR_POLLHUPP return events.
>>
>> Jeff, could you please have a look at it and post any remarks you might
>> have.
>
> If Jeff can't, I can ;)
Ok. Just thought it'd be more Jeff's cup of tea. Thanks.

> 1. One byte is enough; eg. recv(s,&c, 1, MSG_PEEK)
sure

> 2. Not sure that other platforms *always* set POLLHUP for
>      half closed sockets.
It doesn't always set POLLHUP. When socket is in accepted state, 
select() keeps it in the read set and reading with recv() returns 0 
graceful disconnect, possibly sudden disconnect) then POLLHUP is set. 
Seems appropriate to me. When recv() result <0 POLLERR flag is set.

Part of my concern is recv() can return 0 when a socket is ready for 
accept(). We just cannot detect this situation proper. My assumption is 
here that it cannot happen with sockets in the poller: they are in 
accept()-ed state already.

> 3. Missing an actual .diff -u file
added

>
>> How do I get about to get a patch like this adopted in the apr source?
>>
>
> Create a proper patch. It can be a while until someone
> does your homework :)
the diff enough?

Thanks,
Eric

>
>
>
> Regards

diff -u select.c.orig select.c
--- select.c.orig	2009-10-02 18:24:00.000000000 +0200
+++ select.c	2011-07-07 14:55:29.000000000 +0200
@@ -149,6 +149,14 @@
              break;
          }
          if (FD_ISSET(fd, &readset)) {
+            char c;
+            int r = recv(fd, &c, 1, MSG_PEEK);
+            if (r == 0) {
+                aprset[i].rtnevents |= APR_POLLHUP;
+            }
+            else if (r < 0) {
+                aprset[i].rtnevents |= APR_POLLERR;
+            }
              aprset[i].rtnevents |= APR_POLLIN;
          }
          if (FD_ISSET(fd, &writeset)) {
@@ -399,6 +407,14 @@
              pollset->p->result_set[j] = pollset->p->query_set[i];
              pollset->p->result_set[j].rtnevents = 0;
              if (FD_ISSET(fd, &readset)) {
+                char c;
+                int r = recv(fd, &c, 1, MSG_PEEK);
+                if (r == 0) {
+                    pollset->p->result_set[j].rtnevents |= APR_POLLHUP;
+                }
+                else if (r < 0) {
+                    pollset->p->result_set[j].rtnevents |= APR_POLLERR;
+                }
                  pollset->p->result_set[j].rtnevents |= APR_POLLIN;
              }
              if (FD_ISSET(fd, &writeset)) {



-- 
-------------------------------------------
| Eric van der Maarel                     |
| NEDAP IDEAS                             |
| eric.vandermaarel@nedap.com             |
-------------------------------------------^[ZZ

Mime
View raw message