Improve ability to debug one time listeners blocking the event loop (#110064)
This commit is contained in:
parent
720fb7da59
commit
b5afdf34f4
2 changed files with 23 additions and 2 deletions
|
@ -22,6 +22,7 @@ from dataclasses import dataclass
|
||||||
import datetime
|
import datetime
|
||||||
import enum
|
import enum
|
||||||
import functools
|
import functools
|
||||||
|
import inspect
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import pathlib
|
import pathlib
|
||||||
|
@ -1158,7 +1159,7 @@ class _OneTimeListener:
|
||||||
remove: CALLBACK_TYPE | None = None
|
remove: CALLBACK_TYPE | None = None
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def async_call(self, event: Event) -> None:
|
def __call__(self, event: Event) -> None:
|
||||||
"""Remove listener from event bus and then fire listener."""
|
"""Remove listener from event bus and then fire listener."""
|
||||||
if not self.remove:
|
if not self.remove:
|
||||||
# If the listener was already removed, we don't need to do anything
|
# If the listener was already removed, we don't need to do anything
|
||||||
|
@ -1167,6 +1168,13 @@ class _OneTimeListener:
|
||||||
self.remove = None
|
self.remove = None
|
||||||
self.hass.async_run_job(self.listener, event)
|
self.hass.async_run_job(self.listener, event)
|
||||||
|
|
||||||
|
def __repr__(self) -> str:
|
||||||
|
"""Return the representation of the listener and source module."""
|
||||||
|
module = inspect.getmodule(self.listener)
|
||||||
|
if module:
|
||||||
|
return f"<_OneTimeListener {module.__name__}:{self.listener}>"
|
||||||
|
return f"<_OneTimeListener {self.listener}>"
|
||||||
|
|
||||||
|
|
||||||
class EventBus:
|
class EventBus:
|
||||||
"""Allow the firing of and listening for events."""
|
"""Allow the firing of and listening for events."""
|
||||||
|
@ -1364,7 +1372,7 @@ class EventBus:
|
||||||
event_type,
|
event_type,
|
||||||
(
|
(
|
||||||
HassJob(
|
HassJob(
|
||||||
one_time_listener.async_call,
|
one_time_listener,
|
||||||
f"onetime listen {event_type} {listener}",
|
f"onetime listen {event_type} {listener}",
|
||||||
job_type=HassJobType.Callback,
|
job_type=HassJobType.Callback,
|
||||||
),
|
),
|
||||||
|
|
|
@ -2818,3 +2818,16 @@ def test_deprecated_constants(
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Test deprecated constants."""
|
"""Test deprecated constants."""
|
||||||
import_and_test_deprecated_constant_enum(caplog, ha, enum, "SOURCE_", "2025.1")
|
import_and_test_deprecated_constant_enum(caplog, ha, enum, "SOURCE_", "2025.1")
|
||||||
|
|
||||||
|
|
||||||
|
def test_one_time_listener_repr(hass: HomeAssistant) -> None:
|
||||||
|
"""Test one time listener repr."""
|
||||||
|
|
||||||
|
def _listener(event: ha.Event):
|
||||||
|
"""Test listener."""
|
||||||
|
|
||||||
|
one_time_listener = ha._OneTimeListener(hass, _listener)
|
||||||
|
repr_str = repr(one_time_listener)
|
||||||
|
assert "OneTimeListener" in repr_str
|
||||||
|
assert "test_core" in repr_str
|
||||||
|
assert "_listener" in repr_str
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue