diff --git a/ntcore/src/main/native/cpp/NetworkServer.cpp b/ntcore/src/main/native/cpp/NetworkServer.cpp index b6d8e0d79f..86d20b454f 100644 --- a/ntcore/src/main/native/cpp/NetworkServer.cpp +++ b/ntcore/src/main/native/cpp/NetworkServer.cpp @@ -125,7 +125,9 @@ void NetworkServer::ServerConnection::UpdateOutgoingTimer(uint32_t repeatMs) { void NetworkServer::ServerConnection::ConnectionClosed() { // don't call back into m_server if it's being destroyed if (!m_outgoingTimer->IsLoopClosing()) { - m_server.m_serverImpl.RemoveClient(m_clientId); + uv::Timer::SingleShot(m_outgoingTimer->GetLoopRef(), uv::Timer::Time{0}, + [client = m_server.m_serverImpl.RemoveClient( + m_clientId)]() mutable { client.reset(); }); m_server.RemoveConnection(this); } m_outgoingTimer->Close(); diff --git a/ntcore/src/main/native/cpp/net/ServerImpl.cpp b/ntcore/src/main/native/cpp/net/ServerImpl.cpp index bbbc85d0a0..96eedf5ed0 100644 --- a/ntcore/src/main/native/cpp/net/ServerImpl.cpp +++ b/ntcore/src/main/native/cpp/net/ServerImpl.cpp @@ -1252,7 +1252,7 @@ int ServerImpl::AddClient3(std::string_view connInfo, bool local, return index; } -void ServerImpl::RemoveClient(int clientId) { +std::shared_ptr ServerImpl::RemoveClient(int clientId) { DEBUG3("RemoveClient({})", clientId); auto& client = m_clients[clientId]; @@ -1288,8 +1288,7 @@ void ServerImpl::RemoveClient(int clientId) { DeleteTopic(client->m_metaPub); DeleteTopic(client->m_metaSub); - // delete the client - client.reset(); + return std::move(client); } bool ServerImpl::PersistentChanged() { diff --git a/ntcore/src/main/native/cpp/net/ServerImpl.h b/ntcore/src/main/native/cpp/net/ServerImpl.h index d84a06ce29..937ba0e533 100644 --- a/ntcore/src/main/native/cpp/net/ServerImpl.h +++ b/ntcore/src/main/native/cpp/net/ServerImpl.h @@ -80,7 +80,7 @@ class ServerImpl final { int AddClient3(std::string_view connInfo, bool local, net3::WireConnection3& wire, Connected3Func connected, SetPeriodicFunc setPeriodic); - void RemoveClient(int clientId); + std::shared_ptr RemoveClient(int clientId); void ConnectionsChanged(const std::vector& conns);