]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Split start() in two: setup and connect handling. Cleanup call create/delete
authorAmos Jeffries <squid3@treenet.co.nz>
Tue, 20 Jul 2010 06:44:23 +0000 (18:44 +1200)
committerAmos Jeffries <squid3@treenet.co.nz>
Tue, 20 Jul 2010 06:44:23 +0000 (18:44 +1200)
src/comm/ConnOpener.cc
src/comm/ConnOpener.h

index 706e7539cbd9f55c04c6d68b4d12f04ffe3ca74a..1e6c82c6c28e6eea4c40f9bc11cef0497ed402d5 100644 (file)
@@ -96,20 +96,6 @@ Comm::ConnOpener::getHost() const
 void
 Comm::ConnOpener::doneConnecting(comm_err_t status, int xerrno)
 {
-    /* remove handlers we don't want to happen anymore */
-    if (conn_ != NULL && conn_->isOpen()) {
-        if (calls_.earlyAbort_ != NULL) {
-            comm_remove_close_handler(conn_->fd, calls_.earlyAbort_);
-            calls_.earlyAbort_->cancel("Comm::ConnOpener completed.");
-            calls_.earlyAbort_ = NULL;
-        }
-        if (calls_.timeout_ != NULL) {
-            commSetTimeout(conn_->fd, -1, NULL, NULL);
-            calls_.timeout_->cancel("Comm::ConnOpener completed.");
-            calls_.timeout_ = NULL;
-        }
-    }
-
     if (callback_ != NULL) {
         typedef CommConnectCbParams Params;
         Params &params = GetCommParams<Params>(callback_);
@@ -124,9 +110,7 @@ Comm::ConnOpener::doneConnecting(comm_err_t status, int xerrno)
     conn_ = NULL;
 }
 
-/** Actual start opening a TCP connection. */
-void
-Comm::ConnOpener::start()
+void Comm::ConnOpener::start()
 {
     Must(conn_ != NULL);
 
@@ -148,22 +132,30 @@ Comm::ConnOpener::start()
             typedef CommCbMemFunT<Comm::ConnOpener, CommConnectCbParams> Dialer;
             calls_.earlyAbort_ = asyncCall(5, 4, "Comm::ConnOpener::earlyAbort",
                                          Dialer(this, &Comm::ConnOpener::earlyAbort));
+            comm_add_close_handler(conn_->fd, calls_.earlyAbort_);
         }
-        comm_add_close_handler(conn_->fd, calls_.earlyAbort_);
 
         if (calls_.timeout_ == NULL) {
             typedef CommCbMemFunT<Comm::ConnOpener, CommTimeoutCbParams> Dialer;
             calls_.timeout_ = asyncCall(5, 4, "Comm::ConnOpener::timeout",
                                       Dialer(this, &Comm::ConnOpener::timeout));
+            debugs(5, 3, HERE << "FD " << conn_->fd << " timeout " << connectTimeout_);
+            commSetTimeout(conn_->fd, connectTimeout_, calls_.timeout_);
         }
-        debugs(5, 3, HERE << "FD " << conn_->fd << " timeout " << connectTimeout_);
-        commSetTimeout(conn_->fd, connectTimeout_, calls_.timeout_);
 
         if (connStart_ == 0) {
             connStart_ = squid_curtime;
         }
     }
 
+    tryConnectiog();
+}
+
+void
+Comm::ConnOpener::tryConnecting()
+{
+    Must(conn_ != NULL);
+
     totalTries_++;
 
     switch (comm_connect_addr(conn_->fd, conn_->remote) ) {
@@ -223,7 +215,7 @@ Comm::ConnOpener::start()
             debugs(5, 5, HERE << "FD " << conn_->fd << ": * - ERR took too long already.");
             doneConnecting(COMM_TIMEOUT, errno);
         } else if (failRetries_ < Config.connect_retries) {
-            start();
+            tryConnecting();
         } else {
             // send ERROR back to the upper layer.
             debugs(5, 5, HERE << "FD " << conn_->fd << ": * - ERR tried too many times already.");
@@ -248,7 +240,7 @@ Comm::ConnOpener::earlyAbort(const CommConnectCbParams &io)
 void
 Comm::ConnOpener::connect(const CommConnectCbParams &unused)
 {
-    start();
+    tryConnecting();
 }
 
 /**
@@ -258,7 +250,7 @@ Comm::ConnOpener::connect(const CommConnectCbParams &unused)
 void
 Comm::ConnOpener::timeout(const CommTimeoutCbParams &unused)
 {
-    start();
+    tryConnecting();
 }
 
 /* Legacy Wrapper for the retry event after COMM_INPROGRESS
@@ -268,7 +260,7 @@ void
 Comm::ConnOpener::ConnectRetry(int fd, void *data)
 {
     ConnOpener *cs = static_cast<Comm::ConnOpener *>(data);
-    cs->start();
+    cs->tryConnecting();
 
     // see if its done and delete Comm::ConnOpener? comm Writes are not yet a Job call.
     // so the automatic cleanup on call completion does not seem to happen
index 42da32eddfdfb5a8001c9942e73e3be371c03ce0..ad3d232250dce211de9fb36cc689eff4d4c61829 100644 (file)
@@ -28,6 +28,7 @@ public:
 
     void setHost(const char *);    ///< set the hostname note for this connection
     const char * getHost() const;  ///< get the hostname noted for this connection
+    void tryConnecting();          ///< actually start opening a TCP connection.
 
 private:
     /* These objects may NOT be created without connections to act on. Do not define this operator. */