diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index f00c5d5a..0d2380c9 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -13,3 +13,7 @@ ``` * `Receiver.filter()` can now properly handle `TypeGuard`s. The resulting receiver will now have the narrowed type when a `TypeGuard` is used. + +## Bug Fixes + +- Fixed a memory leak in the timer. diff --git a/src/frequenz/channels/timer.py b/src/frequenz/channels/timer.py index b695fb64..2785feea 100644 --- a/src/frequenz/channels/timer.py +++ b/src/frequenz/channels/timer.py @@ -684,14 +684,20 @@ async def ready(self) -> bool: # noqa: DOC502 # could be reset while we are sleeping, in which case we need to recalculate # the time to the next tick and try again. while time_to_next_tick > 0: - await next( - asyncio.as_completed( - [ - asyncio.sleep(time_to_next_tick / 1_000_000), - self._reset_event.wait(), - ] - ) + _, pending = await asyncio.wait( + [ + asyncio.create_task(asyncio.sleep(time_to_next_tick / 1_000_000)), + asyncio.create_task(self._reset_event.wait()), + ], + return_when=asyncio.FIRST_COMPLETED, ) + for task in pending: + task.cancel() + try: + await task + except asyncio.CancelledError: + pass + self._reset_event.clear() now = self._now() time_to_next_tick = self._next_tick_time - now