From 443871ec0f8bb87859d8101d1d1d24b3f19929bf Mon Sep 17 00:00:00 2001 From: Lion Kortlepel Date: Thu, 11 Jan 2024 14:30:25 +0100 Subject: [PATCH] remove usages of weak_ptr --- include/TNetwork.h | 4 ++-- include/TServer.h | 2 +- src/Client.cpp | 2 -- src/TNetwork.cpp | 40 +++++++++------------------------------- src/TServer.cpp | 35 +++++++++++++++-------------------- 5 files changed, 27 insertions(+), 56 deletions(-) diff --git a/include/TNetwork.h b/include/TNetwork.h index d52fbb0..798e1b9 100644 --- a/include/TNetwork.h +++ b/include/TNetwork.h @@ -44,8 +44,8 @@ private: std::vector UDPRcvFromClient(ip::udp::endpoint& ClientEndpoint); void HandleDownload(TConnection&& TCPSock); void OnConnect(const std::weak_ptr& c); - void TCPClient(const std::weak_ptr& c); - void Looper(const std::weak_ptr& c); + void TCPClient(const std::shared_ptr& c); + void Looper(const std::shared_ptr& c); void Parse(TClient& c, const std::vector& Packet); void SendFile(TClient& c, const std::string& Name); bool TCPSendRaw(TClient& C, ip::tcp::socket& socket, const uint8_t* Data, size_t Size); diff --git a/include/TServer.h b/include/TServer.h index 7ef4193..0f7e64d 100644 --- a/include/TServer.h +++ b/include/TServer.h @@ -27,7 +27,7 @@ public: void ForEachClient(const std::function&)> Fn); size_t ClientCount() const; - void GlobalParser(const std::weak_ptr& Client, std::vector&& Packet, TPPSMonitor& PPSMonitor, TNetwork& Network); + void GlobalParser(const std::shared_ptr& Client, std::vector&& Packet, TPPSMonitor& PPSMonitor, TNetwork& Network); static void HandleEvent(TClient& c, const std::string& Data); RWMutex& GetClientMutex() const { return mClientsMutex; } diff --git a/src/Client.cpp b/src/Client.cpp index a7036a9..b815886 100644 --- a/src/Client.cpp +++ b/src/Client.cpp @@ -144,8 +144,6 @@ std::optional> GetClient(TServer& Server, int ID) { MaybeClient = Client; return false; } - } else { - beammp_debugf("Found an expired client while looking for id {}", ID); return true; }); return MaybeClient; diff --git a/src/TNetwork.cpp b/src/TNetwork.cpp index ed4991e..a453986 100644 --- a/src/TNetwork.cpp +++ b/src/TNetwork.cpp @@ -91,9 +91,8 @@ void TNetwork::UDPServerMain() { Client->UDPAddress = client; Client->IsConnected = true; Data.erase(Data.begin(), Data.begin() + 2); - mServer.GlobalParser(ClientPtr, std::move(Data), mPPSMonitor, *this); + mServer.GlobalParser(Client, std::move(Data), mPPSMonitor, *this); } - return true; }); } catch (const std::exception& e) { @@ -471,16 +470,10 @@ void TNetwork::ClientKick(TClient& c, const std::string& R) { Disconnect(c); } -void TNetwork::Looper(const std::weak_ptr& c) { +void TNetwork::Looper(const std::shared_ptr& Client) { RegisterThreadAuto(); - while (!c.expired()) { - auto Client = c.lock(); - if (Client->IsDisconnected()) { - beammp_debug("client is disconnected, breaking client loop"); - break; - } + while (!Client->IsDisconnected()) { if (!Client->IsSyncing.get() && Client->IsSynced.get() && Client->MissedPacketsQueue->size() != 0) { - // debug("sending " + std::to_string(Client->MissedPacketQueueSize()) + " queued packets"); while (Client->MissedPacketsQueue->size() > 0) { std::vector QData {}; { // locked context @@ -491,7 +484,6 @@ void TNetwork::Looper(const std::weak_ptr& c) { QData = Lock->front(); Lock->pop(); } // end locked context - // beammp_debug("sending a missed packet: " + QData); if (!TCPSend(*Client, QData, true)) { Disconnect(Client); auto Lock = Client->MissedPacketsQueue; @@ -507,30 +499,22 @@ void TNetwork::Looper(const std::weak_ptr& c) { } } -void TNetwork::TCPClient(const std::weak_ptr& c) { - // TODO: the c.expired() might cause issues here, remove if you end up here with your debugger - if (c.expired() || !c.lock()->TCPSocket->is_open()) { - mServer.RemoveClient(c); - return; - } +void TNetwork::TCPClient(const std::shared_ptr& c) { OnConnect(c); - RegisterThread("(" + std::to_string(c.lock()->ID.get()) + ") \"" + c.lock()->Name.get() + "\""); + RegisterThread("(" + std::to_string(c->ID.get()) + ") \"" + c->Name.get() + "\""); std::thread QueueSync(&TNetwork::Looper, this, c); while (true) { - if (c.expired()) - break; - auto Client = c.lock(); - if (Client->IsDisconnected()) { + if (c->IsDisconnected()) { beammp_debug("client status < 0, breaking client loop"); break; } - auto res = TCPRcv(*Client); + auto res = TCPRcv(*c); if (res.empty()) { beammp_debug("TCPRcv empty"); - Disconnect(Client); + Disconnect(c); break; } mServer.GlobalParser(c, std::move(res), mPPSMonitor, *this); @@ -539,13 +523,7 @@ void TNetwork::TCPClient(const std::weak_ptr& c) { if (QueueSync.joinable()) QueueSync.join(); - if (!c.expired()) { - auto Client = c.lock(); - Disconnect(c); - return; - } else { - beammp_warn("client expired in TCPClient, should never happen"); - } + Disconnect(c); } void TNetwork::UpdatePlayer(TClient& Client) { diff --git a/src/TServer.cpp b/src/TServer.cpp index 7dae64f..600e0a6 100644 --- a/src/TServer.cpp +++ b/src/TServer.cpp @@ -176,7 +176,7 @@ size_t TServer::ClientCount() const { return mClients.size(); } -void TServer::GlobalParser(const std::weak_ptr& Client, std::vector&& Packet, TPPSMonitor& PPSMonitor, TNetwork& Network) { +void TServer::GlobalParser(const std::shared_ptr& Client, std::vector&& Packet, TPPSMonitor& PPSMonitor, TNetwork& Network) { constexpr std::string_view ABG = "ABG:"; if (Packet.size() >= ABG.size() && std::equal(Packet.begin(), Packet.begin() + ABG.size(), ABG.begin(), ABG.end())) { Packet.erase(Packet.begin(), Packet.begin() + ABG.size()); @@ -186,11 +186,6 @@ void TServer::GlobalParser(const std::weak_ptr& Client, std::vector& Client, std::vector= 86) { PPSMonitor.IncrementInternalPPS(); - Network.SendToAll(LockedClient.get(), Packet, false, false); + Network.SendToAll(Client.get(), Packet, false, false); return; } switch (Code) { @@ -209,18 +204,18 @@ void TServer::GlobalParser(const std::weak_ptr& Client, std::vector 1000) { - beammp_debug(("Received data from: ") + LockedClient->Name.get() + (" Size: ") + std::to_string(Packet.size())); + beammp_debug(("Received data from: ") + Client->Name.get() + (" Size: ") + std::to_string(Packet.size())); } - ParseVehicle(*LockedClient, StringPacket, Network); + ParseVehicle(*Client, StringPacket, Network); return; case 'C': { if (Packet.size() < 4 || std::find(Packet.begin() + 3, Packet.end(), ':') == Packet.end()) @@ -232,12 +227,12 @@ void TServer::GlobalParser(const std::weak_ptr& Client, std::vectorName.get(), LockedClient->ID.get()); + beammp_debugf("Empty chat message received from '{}' ({}), ignoring it", Client->Name.get(), Client->ID.get()); return; } - auto Futures = LuaAPI::MP::Engine->TriggerEvent("onChatMessage", "", LockedClient->ID.get(), LockedClient->Name.get(), Message); + auto Futures = LuaAPI::MP::Engine->TriggerEvent("onChatMessage", "", Client->ID.get(), Client->Name.get(), Message); TLuaEngine::WaitForAll(Futures); - LogChatMessage(LockedClient->Name.get(), LockedClient->ID.get(), PacketAsString.substr(PacketAsString.find(':', 3) + 1)); + LogChatMessage(Client->Name.get(), Client->ID.get(), PacketAsString.substr(PacketAsString.find(':', 3) + 1)); if (std::any_of(Futures.begin(), Futures.end(), [](const std::shared_ptr& Elem) { return !Elem->Error @@ -246,21 +241,21 @@ void TServer::GlobalParser(const std::weak_ptr& Client, std::vectorName.get(), Message); + std::string SanitizedPacket = fmt::format("C:{}: {}", Client->Name.get(), Message); Network.SendToAll(nullptr, StringToVector(SanitizedPacket), true, true); return; } case 'E': - HandleEvent(*LockedClient, StringPacket); + HandleEvent(*Client, StringPacket); return; case 'N': beammp_trace("got 'N' packet (" + std::to_string(Packet.size()) + ")"); - Network.SendToAll(LockedClient.get(), Packet, false, true); + Network.SendToAll(Client.get(), Packet, false, true); return; case 'Z': // position packet PPSMonitor.IncrementInternalPPS(); - Network.SendToAll(LockedClient.get(), Packet, false, false); - HandlePosition(*LockedClient, StringPacket); + Network.SendToAll(Client.get(), Packet, false, false); + HandlePosition(*Client, StringPacket); return; default: return;