]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
API for AcceptLimiter to allow pruning pending events.
authorAmos Jeffries <squid3@treenet.co.nz>
Tue, 7 Sep 2010 10:35:13 +0000 (22:35 +1200)
committerAmos Jeffries <squid3@treenet.co.nz>
Tue, 7 Sep 2010 10:35:13 +0000 (22:35 +1200)
src/comm/AcceptLimiter.cc
src/comm/AcceptLimiter.h

index f101a1fbe8bc35b399c096fe0cbb1075e65d35c9..b4cbcf1c9e73906d71783656eae1fac9a15ae283 100644 (file)
@@ -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;
+        }
     }
 }
index 253840206215bc02cb514eb1107196527ac3a676..26b8a8e6b62014ed8fd96ab3f3c907f76c956b29 100644 (file)
@@ -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();