From a6a4bd18f7046696e81a9e36fb93f0bd398c1bf6 Mon Sep 17 00:00:00 2001 From: Marko Kreen Date: Thu, 3 Jan 2008 21:42:55 +0000 Subject: [PATCH] looping accept() to drain backlog fully --- src/pooler.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/pooler.c b/src/pooler.c index 5c6d893..e707b21 100644 --- a/src/pooler.c +++ b/src/pooler.c @@ -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) -- 2.39.5