diff --git a/iocore/net/P_UnixNetVConnection.h b/iocore/net/P_UnixNetVConnection.h index 37b4278d550..1fef6b926d7 100644 --- a/iocore/net/P_UnixNetVConnection.h +++ b/iocore/net/P_UnixNetVConnection.h @@ -266,6 +266,7 @@ class UnixNetVConnection : public NetVConnection const sockaddr *origin_trace_addr; int origin_trace_port; + int startEvent(int event, Event *e); int acceptEvent(int event, Event *e); int mainEvent(int event, Event *e); virtual int connectUp(EThread *t, int fd); diff --git a/iocore/net/SSLNetVConnection.cc b/iocore/net/SSLNetVConnection.cc index 881b71a5da9..72b691333a8 100644 --- a/iocore/net/SSLNetVConnection.cc +++ b/iocore/net/SSLNetVConnection.cc @@ -957,6 +957,7 @@ SSLNetVConnection::free(EThread *t) con.close(); clear(); + SET_CONTINUATION_HANDLER(this, (SSLNetVConnHandler)&SSLNetVConnection::startEvent); ink_assert(con.fd == NO_FD); ink_assert(t == this_ethread()); diff --git a/iocore/net/UnixNetVConnection.cc b/iocore/net/UnixNetVConnection.cc index 6fb6fa8ca37..f25f9bb7e0d 100644 --- a/iocore/net/UnixNetVConnection.cc +++ b/iocore/net/UnixNetVConnection.cc @@ -894,6 +894,7 @@ UnixNetVConnection::UnixNetVConnection() origin_trace_addr(nullptr), origin_trace_port(0) { + SET_HANDLER((NetVConnHandler)&UnixNetVConnection::startEvent); } // Private methods @@ -1067,6 +1068,22 @@ UnixNetVConnection::netActivity(EThread *lthread) net_activity(this, lthread); } +int +UnixNetVConnection::startEvent(int /* event ATS_UNUSED */, Event *e) +{ + MUTEX_TRY_LOCK(lock, get_NetHandler(e->ethread)->mutex, e->ethread); + if (!lock.is_locked()) { + e->schedule_in(HRTIME_MSECONDS(net_retry_delay)); + return EVENT_CONT; + } + if (!action_.cancelled) { + connectUp(e->ethread, NO_FD); + } else { + free(e->ethread); + } + return EVENT_DONE; +} + int UnixNetVConnection::acceptEvent(int event, Event *e) { @@ -1356,6 +1373,7 @@ UnixNetVConnection::free(EThread *t) con.close(); clear(); + SET_CONTINUATION_HANDLER(this, (NetVConnHandler)&UnixNetVConnection::startEvent); ink_assert(con.fd == NO_FD); ink_assert(t == this_ethread());