From: Amos Jeffries Date: Tue, 7 Sep 2010 10:35:13 +0000 (+1200) Subject: API for AcceptLimiter to allow pruning pending events. X-Git-Tag: take08~55^2~124^2~70 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=166ba587475d29cefc4f2c581e6876c2c4f788b4;p=thirdparty%2Fsquid.git API for AcceptLimiter to allow pruning pending events. --- diff --git a/src/comm/AcceptLimiter.cc b/src/comm/AcceptLimiter.cc index f101a1fbe8..b4cbcf1c9e 100644 --- a/src/comm/AcceptLimiter.cc +++ b/src/comm/AcceptLimiter.cc @@ -15,19 +15,34 @@ void Comm::AcceptLimiter::defer(Comm::ConnAcceptor *afd) { afd->isLimited++; - debugs(5, 5, HERE << "FD " << afd->conn->fd << " x" << afd->isLimited); + debugs(5, 5, HERE << afd->conn << " x" << afd->isLimited); deferred.push_back(afd); } +void +Comm::AcceptLimiter::removeDead(Comm::ConnAcceptor *afd) +{ + for (unsigned int i = 0; i < deferred.size() && afd->isLimited > 0; i++) { + if (deferred[i] == afd) { + deferred[i] = NULL; + afd->isLimited--; + debugs(5, 5, HERE << afd->conn << " x" << afd->isLimited); + } + } +} + void Comm::AcceptLimiter::kick() { debugs(5, 5, HERE << " size=" << deferred.size()); - if (deferred.size() > 0 && fdNFree() >= RESERVED_FD) { - debugs(5, 5, HERE << " doing one."); + while (deferred.size() > 0 && fdNFree() >= RESERVED_FD) { /* NP: shift() is equivalent to pop_front(). Giving us a FIFO queue. */ ConnAcceptor *temp = deferred.shift(); - temp->isLimited--; - temp->acceptNext(); + if (temp != NULL) { + debugs(5, 5, HERE << " doing one."); + temp->isLimited--; + temp->acceptNext(); + break; + } } } diff --git a/src/comm/AcceptLimiter.h b/src/comm/AcceptLimiter.h index 2538402062..26b8a8e6b6 100644 --- a/src/comm/AcceptLimiter.h +++ b/src/comm/AcceptLimiter.h @@ -15,6 +15,7 @@ class ConnAcceptor; * new connection. These handlers are awaiting some FD to become free. * * defer - used only by Comm layer ConnAcceptor adding themselves when FD are limited. + * removeDead - used only by Comm layer ConnAcceptor to remove themselves when dying. * kick - used by Comm layer when FD are closed. */ class AcceptLimiter @@ -27,6 +28,9 @@ public: /** delay accepting a new client connection. */ void defer(Comm::ConnAcceptor *afd); + /** remove all records of an acceptor. Only to be called by the ConnAcceptor::swanSong() */ + void removeDead(Comm::ConnAcceptor *afd); + /** try to accept and begin processing any delayed client connections. */ void kick();