[core] fast_select scan removal: address review feedback

- Drop redundant cached_sock_ = nullptr assignment in close(). After
  closed_ = true the socket is a corpse and no ready() or other member
  access is valid, so the nulling is not load-bearing. The comment now
  explains why on both impl variants.

- Reword the yield_with_select_ comment so the wake-source sentence
  reads as a complete list rather than a trailing fragment.
This commit is contained in:
J. Nick Koston
2026-04-10 20:58:12 -10:00
parent 7ce49089a0
commit 4a9d3da962
3 changed files with 10 additions and 12 deletions
@@ -34,11 +34,10 @@ BSDSocketImpl::~BSDSocketImpl() {
int BSDSocketImpl::close() {
if (!this->closed_) {
#ifdef USE_LWIP_FAST_SELECT
// All LwIP sockets share the same static event_callback, so there is no per-socket
// unhook needed — just drop the cached pointer before the socket is destroyed.
this->cached_sock_ = nullptr;
#else
#ifndef USE_LWIP_FAST_SELECT
// All LwIP sockets share the same static event_callback, so on the fast-select path
// there is no per-socket unhook needed. cached_sock_ is not cleared because closed_
// makes the socket a corpse — no ready() or other member access is valid afterwards.
if (this->loop_monitored_) {
App.unregister_socket_fd(this->fd_);
}
@@ -34,11 +34,10 @@ LwIPSocketImpl::~LwIPSocketImpl() {
int LwIPSocketImpl::close() {
if (!this->closed_) {
#ifdef USE_LWIP_FAST_SELECT
// All LwIP sockets share the same static event_callback, so there is no per-socket
// unhook needed — just drop the cached pointer before the socket is destroyed.
this->cached_sock_ = nullptr;
#else
#ifndef USE_LWIP_FAST_SELECT
// All LwIP sockets share the same static event_callback, so on the fast-select path
// there is no per-socket unhook needed. cached_sock_ is not cleared because closed_
// makes the socket a corpse — no ready() or other member access is valid afterwards.
if (this->loop_monitored_) {
App.unregister_socket_fd(this->fd_);
}
+2 -2
View File
@@ -895,8 +895,8 @@ inline void ESPHOME_ALWAYS_INLINE Application::yield_with_select_(uint32_t delay
// event_callback wrapper (see lwip_fast_select.c) are the single source of truth for
// socket wake-ups. Every NETCONN_EVT_RCVPLUS posts an xTaskNotifyGive, so any notification
// that lands between wakes keeps the counter non-zero (next ulTaskNotifyTake returns
// immediately) or wakes a blocked Take directly. Also woken by wake_loop_threadsafe()
// from background tasks, or timeout.
// immediately) or wakes a blocked Take directly. Additional wake sources:
// wake_loop_threadsafe() from background tasks, and the delay_ms timeout.
if (delay_ms == 0) [[unlikely]] {
yield();
return;