]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Fix leaked TcpAcceptor job on reconfiguration
authorAlex Rousskov <rousskov@measurement-factory.com>
Tue, 3 Jun 2014 07:10:15 +0000 (01:10 -0600)
committerAmos Jeffries <squid3@treenet.co.nz>
Tue, 3 Jun 2014 07:10:15 +0000 (01:10 -0600)
... 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 0e703024fdafbca3967ed53de2e1f937169d098e..5582c37ced43194bd3e4bb7fcc08f4fd4f2544a9 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 48aee211eeb0d92fed8c4f2400dd7765e5f9b4d5..3ca2a9773a26d23f892b4711247f13680793863c 100644 (file)
@@ -7,6 +7,8 @@
 #include "comm_err_t.h"
 #include "comm/forward.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);
 };