looping accept() to drain backlog fully
authorMarko Kreen <markokr@gmail.com>
Thu, 3 Jan 2008 21:42:55 +0000 (21:42 +0000)
committerMarko Kreen <markokr@gmail.com>
Thu, 3 Jan 2008 21:42:55 +0000 (21:42 +0000)
src/pooler.c

index 5c6d893bba6ba39a8a06060f8aae7e7e1896c7c9..e707b21f4763b33f93d2c503728179fcf598c982 100644 (file)
@@ -180,9 +180,14 @@ static void pool_accept(int sock, short flags, void *is_unix)
        } addr;
        socklen_t len = sizeof(addr);
 
+loop:
        /* get fd */
        fd = accept(sock, &addr.sa, &len);
        if (fd < 0) {
+               /* no more */
+               if (errno == EWOULDBLOCK)
+                       return;
+
                /*
                 * probably fd limit, pointless to try often
                 * wait a bit, hope that admin resolves somehow
@@ -211,6 +216,12 @@ static void pool_accept(int sock, short flags, void *is_unix)
                log_debug("P: new tcp client");
                accept_client(fd, &addr.in, false);
        }
+
+       /*
+        * there may be several clients waiting,
+        * avoid context switch by looping
+        */
+       goto loop;
 }
 
 bool use_pooler_socket(int sock, bool is_unix)