From 600b2e6d7889bb3dff134a285b4a8fc203c5cc18 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 27 May 2025 10:35:37 -0500 Subject: [PATCH] cleanup --- .../components/socket/bsd_sockets_impl.cpp | 28 +++++++++++-------- .../components/socket/lwip_sockets_impl.cpp | 28 +++++++++++-------- esphome/core/application.h | 1 - 3 files changed, 34 insertions(+), 23 deletions(-) diff --git a/esphome/components/socket/bsd_sockets_impl.cpp b/esphome/components/socket/bsd_sockets_impl.cpp index 5027c9b814..d81f8b2179 100644 --- a/esphome/components/socket/bsd_sockets_impl.cpp +++ b/esphome/components/socket/bsd_sockets_impl.cpp @@ -55,17 +55,21 @@ class BSDSocketImpl : public Socket { } int connect(const struct sockaddr *addr, socklen_t addrlen) override { return ::connect(fd_, addr, addrlen); } std::unique_ptr accept(struct sockaddr *addr, socklen_t *addrlen) override { - int fd = ::accept(fd_, addr, addrlen); - if (fd == -1) - return {}; - return make_unique(fd); + return accept_impl(addr, addrlen, false); } std::unique_ptr accept_loop_monitored(struct sockaddr *addr, socklen_t *addrlen) override { + return accept_impl(addr, addrlen, true); + } + + private: + std::unique_ptr accept_impl(struct sockaddr *addr, socklen_t *addrlen, bool loop_monitored) { int fd = ::accept(fd_, addr, addrlen); if (fd == -1) return {}; - return make_unique(fd, true); // Monitored for incoming data + return make_unique(fd, loop_monitored); } + + public: int bind(const struct sockaddr *addr, socklen_t addrlen) override { return ::bind(fd_, addr, addrlen); } int close() override { if (!closed_) { @@ -153,18 +157,20 @@ class BSDSocketImpl : public Socket { bool closed_ = false; }; -std::unique_ptr socket(int domain, int type, int protocol) { +// Helper to create a socket with optional monitoring +static std::unique_ptr create_socket(int domain, int type, int protocol, bool loop_monitored = false) { int ret = ::socket(domain, type, protocol); if (ret == -1) return nullptr; - return std::unique_ptr{new BSDSocketImpl(ret)}; + return std::unique_ptr{new BSDSocketImpl(ret, loop_monitored)}; +} + +std::unique_ptr socket(int domain, int type, int protocol) { + return create_socket(domain, type, protocol, false); } std::unique_ptr socket_loop_monitored(int domain, int type, int protocol) { - int ret = ::socket(domain, type, protocol); - if (ret == -1) - return nullptr; - return std::unique_ptr{new BSDSocketImpl(ret, true)}; + return create_socket(domain, type, protocol, true); } } // namespace socket diff --git a/esphome/components/socket/lwip_sockets_impl.cpp b/esphome/components/socket/lwip_sockets_impl.cpp index 9bf98ee655..9f0e8dee97 100644 --- a/esphome/components/socket/lwip_sockets_impl.cpp +++ b/esphome/components/socket/lwip_sockets_impl.cpp @@ -48,17 +48,21 @@ class LwIPSocketImpl : public Socket { } int connect(const struct sockaddr *addr, socklen_t addrlen) override { return lwip_connect(fd_, addr, addrlen); } std::unique_ptr accept(struct sockaddr *addr, socklen_t *addrlen) override { - int fd = lwip_accept(fd_, addr, addrlen); - if (fd == -1) - return {}; - return make_unique(fd); // Default: not monitored + return accept_impl(addr, addrlen, false); } std::unique_ptr accept_loop_monitored(struct sockaddr *addr, socklen_t *addrlen) override { + return accept_impl(addr, addrlen, true); + } + + private: + std::unique_ptr accept_impl(struct sockaddr *addr, socklen_t *addrlen, bool loop_monitored) { int fd = lwip_accept(fd_, addr, addrlen); if (fd == -1) return {}; - return make_unique(fd, true); // Monitored for incoming data + return make_unique(fd, loop_monitored); } + + public: int bind(const struct sockaddr *addr, socklen_t addrlen) override { return lwip_bind(fd_, addr, addrlen); } int close() override { if (!closed_) { @@ -125,18 +129,20 @@ class LwIPSocketImpl : public Socket { bool closed_ = false; }; -std::unique_ptr socket(int domain, int type, int protocol) { +// Helper to create a socket with optional monitoring +static std::unique_ptr create_socket(int domain, int type, int protocol, bool loop_monitored = false) { int ret = lwip_socket(domain, type, protocol); if (ret == -1) return nullptr; - return std::unique_ptr{new LwIPSocketImpl(ret)}; + return std::unique_ptr{new LwIPSocketImpl(ret, loop_monitored)}; +} + +std::unique_ptr socket(int domain, int type, int protocol) { + return create_socket(domain, type, protocol, false); } std::unique_ptr socket_loop_monitored(int domain, int type, int protocol) { - int ret = lwip_socket(domain, type, protocol); - if (ret == -1) - return nullptr; - return std::unique_ptr{new LwIPSocketImpl(ret, true)}; + return create_socket(domain, type, protocol, true); } } // namespace socket diff --git a/esphome/core/application.h b/esphome/core/application.h index ae7e6b0a96..9b5ba0ce09 100644 --- a/esphome/core/application.h +++ b/esphome/core/application.h @@ -573,7 +573,6 @@ class Application { uint32_t loop_component_start_time_{0}; // Socket select management - // WARNING: These variables are NOT protected by locks and must only be modified from the main loop std::set socket_fds_; // Set of all monitored socket file descriptors bool socket_fds_changed_{false}; // Flag to rebuild base_read_fds_ when socket_fds_ changes int max_fd_{-1}; // Highest file descriptor number for select()