]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Fix leaked TcpAcceptor job on reconfiguration
authorAlex Rousskov <rousskov@measurement-factory.com>
Mon, 2 Jun 2014 05:09:38 +0000 (22:09 -0700)
committerAmos Jeffries <squid3@treenet.co.nz>
Mon, 2 Jun 2014 05:09:38 +0000 (22:09 -0700)
... by monitoring and reacting to the listening socket closure.

Every job that waits for Comm I/O must have a FD closure handler.

src/comm/TcpAcceptor.cc
src/comm/TcpAcceptor.h

index 4e0dfbbc0c183512f1342ea6f3b63e6869a741da..44a6c8263a4623be7ed23b5e0e98e29d187be764 100644 (file)
@@ -122,6 +122,12 @@ Comm::TcpAcceptor::swanSong()
 {
     debugs(5,5, HERE);
     unsubscribe("swanSong");
+    if (IsConnOpen(conn)) {
+        if (closer_ != NULL)
+            comm_remove_close_handler(conn->fd, closer_);
+        conn->close();
+    }
+
     conn = NULL;
     AcceptLimiter::Instance().removeDead(this);
     AsyncJob::swanSong();
@@ -182,6 +188,20 @@ Comm::TcpAcceptor::setListen()
         debugs(5, DBG_CRITICAL, "WARNING: accept_filter not supported on your OS");
 #endif
     }
+
+    typedef CommCbMemFunT<Comm::TcpAcceptor, CommCloseCbParams> Dialer;
+    closer_ = JobCallback(5, 4, Dialer, this, Comm::TcpAcceptor::handleClosure);
+    comm_add_close_handler(conn->fd, closer_);
+}
+
+/// called when listening descriptor is closed by an external force
+/// such as clientHttpConnectionsClose()
+void
+Comm::TcpAcceptor::handleClosure(const CommCloseCbParams &io)
+{
+    closer_ = NULL;
+    conn = NULL;
+    Must(done());
 }
 
 /**
index ee3b392cd15961846da13cd7a4ff77cb4b728234..4ab9e9e3090240affd4ef67e7fda027046cf2f2f 100644 (file)
@@ -7,6 +7,8 @@
 #include "comm/forward.h"
 #include "comm_err_t.h"
 
+class CommCloseCbParams;
+
 namespace Comm
 {
 
@@ -73,6 +75,9 @@ private:
     /// Reserved for read-only use.
     ConnectionPointer conn;
 
+    /// listen socket closure handler
+    AsyncCall::Pointer closer_;
+
     /// Method to test if there are enough file descriptors to open a new client connection
     /// if not the accept() will be postponed
     static bool okToAccept();
@@ -83,6 +88,7 @@ private:
     void acceptOne();
     comm_err_t oldAccept(Comm::ConnectionPointer &details);
     void setListen();
+    void handleClosure(const CommCloseCbParams &io);
 
     CBDATA_CLASS2(TcpAcceptor);
 };