From 42fe1f16ca10531e363bdbddcd93ceb9175ed133 Mon Sep 17 00:00:00 2001 From: Doug Hoyte Date: Wed, 16 Aug 2023 13:37:03 -0400 Subject: [PATCH] WSConnection clean shutdown, fix hubTrigger ownership (it's deleted by the event loop) --- src/WSConnection.h | 18 +++++++++++++++--- src/apps/relay/RelayServer.h | 2 +- src/apps/relay/RelayWebsocket.cpp | 4 ++-- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/WSConnection.h b/src/WSConnection.h index 1360bcc..c577174 100644 --- a/src/WSConnection.h +++ b/src/WSConnection.h @@ -10,8 +10,8 @@ class WSConnection { std::string url; uWS::Hub hub; - uWS::Group *hubGroup; - std::unique_ptr hubTrigger; + uWS::Group *hubGroup = nullptr; + uS::Async *hubTrigger = nullptr; uWS::WebSocket *currWs = nullptr; @@ -29,6 +29,18 @@ class WSConnection { uint64_t reconnectDelayMilliseconds = 5'000; std::string remoteAddr; + ~WSConnection() { + close(); + } + + void close() { + if (hubGroup) hubGroup->close(); + hubGroup = nullptr; + + if (hubTrigger) hubTrigger->close(); + hubTrigger = nullptr; + } + // Should only be called from the websocket thread (ie within an onConnect or onMessage callback) void send(std::string_view msg, uWS::OpCode op = uWS::OpCode::TEXT, size_t *compressedSize = nullptr) { if (currWs) { @@ -120,7 +132,7 @@ class WSConnection { } }; - hubTrigger = std::make_unique(hub.getLoop()); + hubTrigger = new uS::Async(hub.getLoop()); hubTrigger->setData(&asyncCb); hubTrigger->start([](uS::Async *a){ diff --git a/src/apps/relay/RelayServer.h b/src/apps/relay/RelayServer.h index 0ccea26..407e09f 100644 --- a/src/apps/relay/RelayServer.h +++ b/src/apps/relay/RelayServer.h @@ -149,7 +149,7 @@ struct MsgNegentropy : NonCopyable { struct RelayServer { - std::unique_ptr hubTrigger; + uS::Async *hubTrigger = nullptr; // Thread Pools diff --git a/src/apps/relay/RelayWebsocket.cpp b/src/apps/relay/RelayWebsocket.cpp index 2d6116f..74b3952 100644 --- a/src/apps/relay/RelayWebsocket.cpp +++ b/src/apps/relay/RelayWebsocket.cpp @@ -39,7 +39,7 @@ void RelayServer::runWebsocket(ThreadPool::Thread &thr) { }; uWS::Hub hub; - uWS::Group *hubGroup; + uWS::Group *hubGroup = nullptr; flat_hash_map connIdToConnection; uint64_t nextConnectionId = 1; bool gracefulShutdown = false; @@ -219,7 +219,7 @@ void RelayServer::runWebsocket(ThreadPool::Thread &thr) { } }; - hubTrigger = std::make_unique(hub.getLoop()); + hubTrigger = new uS::Async(hub.getLoop()); hubTrigger->setData(&asyncCb); hubTrigger->start([](uS::Async *a){