From 0b35f0484fe14641b101853743747c81bba04116 Mon Sep 17 00:00:00 2001 From: Tixx <83774803+WiserTixx@users.noreply.github.com> Date: Thu, 10 Oct 2024 11:48:59 +0200 Subject: [PATCH 1/3] put blocking http requests on another thread --- src/Network/Core.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Network/Core.cpp b/src/Network/Core.cpp index 1593e50..2a0ca5a 100644 --- a/src/Network/Core.cpp +++ b/src/Network/Core.cpp @@ -114,7 +114,10 @@ void Parse(std::string Data, SOCKET CSocket) { NetReset(); Terminate = true; TCPTerminate = true; - Data = Code + HTTP::Get("https://backend.beammp.com/servers-info"); + Data.clear(); + std::thread([&]() { + CoreSend(Code + HTTP::Get("https://backend.beammp.com/servers-info")); + }).detach(); break; case 'C': StartSync(Data); @@ -210,7 +213,10 @@ void Parse(std::string Data, SOCKET CSocket) { } Data = "N" + Auth.dump(); } else { - Data = "N" + Login(Data.substr(Data.find(':') + 1)); + Data.clear(); + std::thread([&]() { + CoreSend(Code + Login(Data.substr(Data.find(':') + 1))); + }).detach(); } break; case 'W': From 06cb366bb569c2cbb5190947a025d53694f5505e Mon Sep 17 00:00:00 2001 From: Tixx <83774803+WiserTixx@users.noreply.github.com> Date: Thu, 10 Oct 2024 15:49:56 +0200 Subject: [PATCH 2/3] Add mutex to CoreSend --- src/Network/Core.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/Network/Core.cpp b/src/Network/Core.cpp index 2a0ca5a..fb4ab71 100644 --- a/src/Network/Core.cpp +++ b/src/Network/Core.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include "Options.h" extern int TraceBack; @@ -87,7 +88,11 @@ void StartSync(const std::string& Data) { info("Connecting to server"); } +std::mutex sendMutex; + void CoreSend(std::string data) { + std::lock_guard lock(sendMutex); + if (CoreSocket != -1) { int res = send(CoreSocket, (data + "\n").c_str(), int(data.size()) + 1, 0); if (res < 0) { @@ -116,7 +121,7 @@ void Parse(std::string Data, SOCKET CSocket) { TCPTerminate = true; Data.clear(); std::thread([&]() { - CoreSend(Code + HTTP::Get("https://backend.beammp.com/servers-info")); + CoreSend("B" + HTTP::Get("https://backend.beammp.com/servers-info")); }).detach(); break; case 'C': @@ -215,7 +220,7 @@ void Parse(std::string Data, SOCKET CSocket) { } else { Data.clear(); std::thread([&]() { - CoreSend(Code + Login(Data.substr(Data.find(':') + 1))); + CoreSend("N" + Login(Data.substr(Data.find(':') + 1))); }).detach(); } break; @@ -232,12 +237,8 @@ void Parse(std::string Data, SOCKET CSocket) { Data.clear(); break; } - if (!Data.empty() && CSocket != -1) { - int res = send(CSocket, (Data + "\n").c_str(), int(Data.size()) + 1, 0); - if (res < 0) { - debug("(Core) send failed with error: " + std::to_string(WSAGetLastError())); - } - } + if (!Data.empty()) + CoreSend(Data); } void GameHandler(SOCKET Client) { CoreSocket = Client; From 6b6e304cfd9b99371d5e91334b5e4a8844432487 Mon Sep 17 00:00:00 2001 From: Tixx <83774803+WiserTixx@users.noreply.github.com> Date: Fri, 18 Oct 2024 19:23:53 +0200 Subject: [PATCH 3/3] Switch to std::async --- src/Network/Core.cpp | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/Network/Core.cpp b/src/Network/Core.cpp index fb4ab71..7b8e568 100644 --- a/src/Network/Core.cpp +++ b/src/Network/Core.cpp @@ -33,6 +33,8 @@ #include #include "Options.h" +#include + extern int TraceBack; std::set* ConfList = nullptr; bool TCPTerminate = false; @@ -115,14 +117,15 @@ void Parse(std::string Data, SOCKET CSocket) { case 'A': Data = Data.substr(0, 1); break; - case 'B': - NetReset(); - Terminate = true; - TCPTerminate = true; - Data.clear(); - std::thread([&]() { - CoreSend("B" + HTTP::Get("https://backend.beammp.com/servers-info")); - }).detach(); + case 'B': { + NetReset(); + Terminate = true; + TCPTerminate = true; + Data.clear(); + auto future = std::async(std::launch::async, []() { + CoreSend("B" + HTTP::Get("https://backend.beammp.com/servers-info")); + }); + } break; case 'C': StartSync(Data); @@ -218,10 +221,10 @@ void Parse(std::string Data, SOCKET CSocket) { } Data = "N" + Auth.dump(); } else { + auto future = std::async(std::launch::async, [data = std::move(Data)]() { + CoreSend("N" + Login(data.substr(data.find(':') + 1))); + }); Data.clear(); - std::thread([&]() { - CoreSend("N" + Login(Data.substr(Data.find(':') + 1))); - }).detach(); } break; case 'W':