Lifecycle management for sockets.

This commit is contained in:
Robin Davies
2024-10-05 02:14:30 -04:00
parent 6f268daec9
commit 46669cfda9
3 changed files with 20 additions and 6 deletions
-1
View File
@@ -552,7 +552,6 @@ public:
{ {
FinalCleanup(); FinalCleanup();
} }
Lv2Log::error("PiPedalSocketHandler deleted");
} }
+7
View File
@@ -754,7 +754,11 @@ namespace pipedal
public: public:
~WebSocketSession() ~WebSocketSession()
{ {
if (this->socketHandler)
{
this->socketHandler->onSocketClosed();
this->socketHandler = nullptr; this->socketHandler = nullptr;
}
webSocket = nullptr; webSocket = nullptr;
pServer = nullptr; pServer = nullptr;
Lv2Log::info(SS("WebSocketSession closed. " << fromAddress)); Lv2Log::info(SS("WebSocketSession closed. " << fromAddress));
@@ -819,8 +823,11 @@ namespace pipedal
std::lock_guard<std::recursive_mutex> lock{m_sessionsMutex}; std::lock_guard<std::recursive_mutex> lock{m_sessionsMutex};
m_sessions.erase(session); m_sessions.erase(session);
m_connections.erase(hConnection); m_connections.erase(hConnection);
if (session != nullptr)
{
session = nullptr; // probably delete here. session = nullptr; // probably delete here.
} }
}
void NotFound(server::connection_type &connection, const std::string &filename) void NotFound(server::connection_type &connection, const std::string &filename)
{ {
+10 -2
View File
@@ -81,7 +81,6 @@ class WebServerImpl;
class SocketHandler { class SocketHandler {
friend class WebServerImpl; friend class WebServerImpl;
public: public:
class IWriteCallback { class IWriteCallback {
public: public:
virtual void close() = 0; virtual void close() = 0;
@@ -100,6 +99,7 @@ public:
} }
public: public:
virtual void onSocketClosed() = 0;
virtual void onReceive(const std::string_view&text) = 0; virtual void onReceive(const std::string_view&text) = 0;
public: public:
std::string getFromAddress() const { return writeCallback_->getFromAddress(); } std::string getFromAddress() const { return writeCallback_->getFromAddress(); }
@@ -112,12 +112,20 @@ public:
writeCallback_->writeCallback(text); writeCallback_->writeCallback(text);
} }
} }
virtual void OnSocketClosed()
{
writeCallback_ = nullptr;
}
virtual void Close() virtual void Close()
{
if (writeCallback_ != nullptr)
{ {
writeCallback_->close(); writeCallback_->close();
writeCallback_ = nullptr;
}
} }
virtual ~SocketHandler() = default; virtual ~SocketHandler() {}
virtual void onAttach() { } virtual void onAttach() { }