diff options
| author | littleblack111 <littleblack11111@gmail.com> | 2025-06-22 15:09:42 +0800 |
|---|---|---|
| committer | littleblack111 <littleblack11111@gmail.com> | 2025-06-22 15:09:42 +0800 |
| commit | 9b61c218b665f94f5cc383a5e607b951ce6af121 (patch) | |
| tree | 1de1bec4da34170a15737117a02023a39f673ade /src/server/server.cpp | |
| parent | 47375901d5158aa82c3178fe0840c5b77f142720 (diff) | |
refactor(server): properly use weak pointer
API!(server/client:create): require manually specifying server
API!(server/client:newClient): now returns a SP instead of WP
Diffstat (limited to 'src/server/server.cpp')
| -rw-r--r-- | src/server/server.cpp | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/src/server/server.cpp b/src/server/server.cpp index c14a39e..aabbb50 100644 --- a/src/server/server.cpp +++ b/src/server/server.cpp @@ -1,6 +1,7 @@ #include "libsock/server/server.hpp" #include "libsock/types.hpp" #include "misc/FileDescriptor.hpp" +#include <algorithm> #include <cstring> #include <mutex> #include <stdexcept> @@ -14,8 +15,6 @@ namespace Server { Server::Server(uint16_t port, bool reuseaddr, bool keepalive) : m_sockfd(std::make_shared<LibSock::CFileDescriptor>(socket(AF_INET, SOCK_STREAM, 0))) , m_port(port) { - if (pServer) - throw std::runtime_error("server:server Server already exist"); std::lock_guard<std::mutex> lk(m_mutex); if (!m_sockfd->isValid() || m_sockfd->get() < 0) throw std::runtime_error("server:server Failed to create socket"); @@ -37,20 +36,22 @@ Server::Server(uint16_t port, bool reuseaddr, bool keepalive) } SP<Server> Server::create(uint16_t port, bool reuseaddr, bool keepalive) { - if (pServer) - throw std::runtime_error("server:server Server already exist"); - pServer = SP<Server>(new Server(port, reuseaddr, keepalive)); - return pServer; + auto c = SP<Server>(new Server(port, reuseaddr, keepalive)); + vpServer.emplace_back(c); + c->m_self = c; + return c; } -SP<Server> Server::get() { - if (!pServer) - pServer = shared_from_this(); - return pServer; +WP<Server> Server::get() { + std::lock_guard<std::mutex> lk(m_mutex); + if (m_self.expired()) + m_self = shared_from_this(); + return m_self; } Server::~Server() { m_sockfd.reset(); + vpServer.erase(std::remove_if(vpServer.begin(), vpServer.end(), [this](const SP<Server> &sptr) { return sptr.get() == this; }), vpServer.end()); } SP<LibSock::CFileDescriptor> Server::getSocket() const { |
