diff --git a/iocore/net/P_QUICNetVConnection.h b/iocore/net/P_QUICNetVConnection.h index 2b2a7e23830..c01d775cd92 100644 --- a/iocore/net/P_QUICNetVConnection.h +++ b/iocore/net/P_QUICNetVConnection.h @@ -168,6 +168,7 @@ class QUICNetVConnection : public UnixNetVConnection, int connectUp(EThread *t, int fd) override; // QUICNetVConnection + int startEvent(int event, Event *e); int state_pre_handshake(int event, Event *data); int state_handshake(int event, Event *data); int state_connection_established(int event, Event *data); diff --git a/iocore/net/P_UnixNetVConnection.h b/iocore/net/P_UnixNetVConnection.h index e3fb922eeb2..6af42461e28 100644 --- a/iocore/net/P_UnixNetVConnection.h +++ b/iocore/net/P_UnixNetVConnection.h @@ -245,6 +245,7 @@ class UnixNetVConnection : public NetVConnection, public NetEvent bool from_accept_thread = false; NetAccept *accept_object = nullptr; + 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/QUICNetProcessor.cc b/iocore/net/QUICNetProcessor.cc index edb51103c80..5bdaa2b8dc7 100644 --- a/iocore/net/QUICNetProcessor.cc +++ b/iocore/net/QUICNetProcessor.cc @@ -149,6 +149,7 @@ QUICNetProcessor::connect_re(Continuation *cont, sockaddr const *remote_addr, Ne // Setup QUICNetVConnection QUICConnectionId client_dst_cid; client_dst_cid.randomize(); + // vc->init set handler of vc `QUICNetVConnection::startEvent` vc->init(QUIC_SUPPORTED_VERSIONS[0], client_dst_cid, client_dst_cid, con, packet_handler, this->_rtable); packet_handler->init(vc); diff --git a/iocore/net/QUICNetVConnection.cc b/iocore/net/QUICNetVConnection.cc index 80f952d9868..d2d07fddfe2 100644 --- a/iocore/net/QUICNetVConnection.cc +++ b/iocore/net/QUICNetVConnection.cc @@ -242,6 +242,7 @@ void QUICNetVConnection::init(QUICVersion version, QUICConnectionId peer_cid, QUICConnectionId original_cid, UDPConnection *udp_con, QUICPacketHandler *packet_handler, QUICResetTokenTable *rtable) { + SET_HANDLER((NetVConnHandler)&QUICNetVConnection::startEvent); this->_initial_version = version; this->_udp_con = udp_con; this->_packet_handler = packet_handler; @@ -388,6 +389,25 @@ QUICNetVConnection::acceptEvent(int event, Event *e) return EVENT_DONE; } +int +QUICNetVConnection::startEvent(int event, Event *e) +{ + ink_assert(event == EVENT_IMMEDIATE); + 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) { + this->connectUp(e->ethread, NO_FD); + } else { + this->free(e->ethread); + } + + return EVENT_DONE; +} + // XXX This might be called on ET_UDP thread void QUICNetVConnection::start() diff --git a/iocore/net/SSLNetVConnection.cc b/iocore/net/SSLNetVConnection.cc index 27c76bc65a2..da1b473f1b7 100644 --- a/iocore/net/SSLNetVConnection.cc +++ b/iocore/net/SSLNetVConnection.cc @@ -991,6 +991,7 @@ SSLNetVConnection::free(EThread *t) early_data_buf = nullptr; 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 6978247036f..134f354a8cb 100644 --- a/iocore/net/UnixNetVConnection.cc +++ b/iocore/net/UnixNetVConnection.cc @@ -828,7 +828,10 @@ UnixNetVConnection::reenable_re(VIO *vio) } } -UnixNetVConnection::UnixNetVConnection() {} +UnixNetVConnection::UnixNetVConnection() +{ + SET_HANDLER((NetVConnHandler)&UnixNetVConnection::startEvent); +} // Private methods @@ -990,6 +993,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) { @@ -1277,6 +1296,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());