refactor: timer: split out two helpers from _timer_worker
All checks were successful
Build RPi Pico firmware image / Build-Firmware (push) Successful in 4m35s
Check code formatting / Check-C-Format (push) Successful in 8s
Check code formatting / Check-Python-Flake8 (push) Successful in 10s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 5s
Run unit tests on host / Run-Unit-Tests (push) Successful in 8s
Run pytests / Check-Pytest (push) Successful in 11s
All checks were successful
Build RPi Pico firmware image / Build-Firmware (push) Successful in 4m35s
Check code formatting / Check-C-Format (push) Successful in 8s
Check code formatting / Check-Python-Flake8 (push) Successful in 10s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 5s
Run unit tests on host / Run-Unit-Tests (push) Successful in 8s
Run pytests / Check-Pytest (push) Successful in 11s
Signed-off-by: Matthias Blankertz <matthias@blankertz.org>
This commit is contained in:
@@ -50,29 +50,36 @@ class TimerManager(object):
|
|||||||
heapq.heapify(self.timers)
|
heapq.heapify(self.timers)
|
||||||
return i
|
return i
|
||||||
|
|
||||||
|
def _next_timeout(self):
|
||||||
|
if len(self.timers) == 0:
|
||||||
|
if self.timer_debug:
|
||||||
|
print("timer: worker: queue empty")
|
||||||
|
return None
|
||||||
|
cur_nearest = self.timers[0][0]
|
||||||
|
next_timeout = cur_nearest - time.ticks_ms()
|
||||||
|
if self.timer_debug:
|
||||||
|
if next_timeout > 0:
|
||||||
|
print(f"timer: worker: next is {self.timers[0]}, sleep {next_timeout} ms")
|
||||||
|
else:
|
||||||
|
print(f"timer: worker: {self.timers[0]} elapsed @{cur_nearest}, delay {-next_timeout} ms")
|
||||||
|
return next_timeout
|
||||||
|
|
||||||
|
async def _wait(self, timeout):
|
||||||
|
try:
|
||||||
|
await asyncio.wait_for_ms(self.worker_event.wait(), timeout)
|
||||||
|
if self.timer_debug:
|
||||||
|
print("timer: worker: event")
|
||||||
|
# got woken up due to event
|
||||||
|
self.worker_event.clear()
|
||||||
|
return True
|
||||||
|
except asyncio.TimeoutError:
|
||||||
|
return False
|
||||||
|
|
||||||
async def _timer_worker(self):
|
async def _timer_worker(self):
|
||||||
while True:
|
while True:
|
||||||
if len(self.timers) == 0:
|
next_timeout = self._next_timeout()
|
||||||
# Nothing to do
|
if next_timeout is None or next_timeout > 0:
|
||||||
await self.worker_event.wait()
|
await self._wait(next_timeout)
|
||||||
if self.timer_debug:
|
|
||||||
print("_timer_worker: event 0")
|
|
||||||
self.worker_event.clear()
|
|
||||||
continue
|
|
||||||
cur_nearest = self.timers[0][0]
|
|
||||||
wait_time = cur_nearest - time.ticks_ms()
|
|
||||||
if wait_time > 0:
|
|
||||||
if self.timer_debug:
|
|
||||||
print(f"_timer_worker: next is {self.timers[0]}, sleep {wait_time} ms")
|
|
||||||
try:
|
|
||||||
await asyncio.wait_for_ms(self.worker_event.wait(), wait_time)
|
|
||||||
if self.timer_debug:
|
|
||||||
print("_timer_worker: event 1")
|
|
||||||
# got woken up due to event
|
|
||||||
self.worker_event.clear()
|
|
||||||
continue
|
|
||||||
except asyncio.TimeoutError:
|
|
||||||
pass
|
|
||||||
else:
|
else:
|
||||||
_, callback = heapq.heappop(self.timers)
|
_, callback = heapq.heappop(self.timers)
|
||||||
safe_callback(callback, "timer callback")
|
safe_callback(callback, "timer callback")
|
||||||
|
|||||||
Reference in New Issue
Block a user