fix: track intent-retry tasks in the unload-cancelled task registry so removal can't trigger a shell() auto-reconnect (reviewer F2)
This commit is contained in:
1 parent
b91a4242ba
commit
a1e671ac6a
1 file changed
+14
-3
@@ -258,11 +258,11 @@ class NvidiaShieldMediaPlayer(MediaPlayerEntity):
|
||||
and self._adb_poller.connected
|
||||
):
|
||||
# The command was originally served by ADB — retry over ADB.
|
||||
self.hass.async_create_task(
|
||||
self._track_task(
|
||||
self._adb_poller.send_media_command(intent.adb_command)
|
||||
)
|
||||
else:
|
||||
self.hass.async_create_task(
|
||||
self._track_task(
|
||||
self._cmd(intent.command)
|
||||
)
|
||||
self._intent_timer_unsub = async_call_later(
|
||||
@@ -377,7 +377,18 @@ class NvidiaShieldMediaPlayer(MediaPlayerEntity):
|
||||
@callback
|
||||
def _adb_poll_callback(self, _now) -> None:
|
||||
"""Schedule the ADB poll as a tracked task (cancelled on unload)."""
|
||||
task = self.hass.async_create_task(self._adb_poll())
|
||||
self._track_task(self._adb_poll())
|
||||
|
||||
def _track_task(self, coro) -> None:
|
||||
"""Dispatch a background task and register it for unload cancellation.
|
||||
|
||||
Any fire-and-forget task that can touch the ADB poller must go through
|
||||
here: a bare hass.async_create_task survives entity removal and, with
|
||||
shell()'s auto-reconnect, can re-handshake the socket for a removed
|
||||
entity (reviewer finding F2). Cancelation in async_will_remove_from_hass
|
||||
covers poll and intent-retry tasks alike.
|
||||
"""
|
||||
task = self.hass.async_create_task(coro)
|
||||
self._adb_poll_tasks.add(task)
|
||||
task.add_done_callback(self._adb_poll_tasks.discard)
|
||||
|
||||
|
||||
Reference in new issue
Block a user