blob: 87f7ebaadffaf724b92b0aaed3f689e2b62752db [file] [log] [blame]
Mike Frysingerf1ba7ad2022-09-12 05:42:57 -04001# Copyright 2016 The ChromiumOS Authors
Allen Li26d10082016-12-16 16:31:02 -08002# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5"""Sleep loop."""
6
Allen Li13bdf0c2017-03-02 15:18:16 -08007from __future__ import absolute_import
Allen Li26d10082016-12-16 16:31:02 -08008
Chris McDonald59650c32021-07-20 15:29:28 -06009import logging
Allen Li26d10082016-12-16 16:31:02 -080010import time
11
Allen Li26d10082016-12-16 16:31:02 -080012
13logger = logging.getLogger(__name__)
14
15
Alex Klein074f94f2023-06-22 10:32:06 -060016class SleepLoop:
Alex Klein1699fab2022-09-08 08:46:06 -060017 """Sleep loop."""
Allen Li26d10082016-12-16 16:31:02 -080018
Alex Klein1699fab2022-09-08 08:46:06 -060019 def __init__(self, callback, interval=60):
20 """Initialize instance.
Allen Li26d10082016-12-16 16:31:02 -080021
Alex Klein1699fab2022-09-08 08:46:06 -060022 Args:
Trent Apted66736d82023-05-25 10:38:28 +100023 callback: Function to call on each loop.
24 interval: Time between loops in seconds.
Alex Klein1699fab2022-09-08 08:46:06 -060025 """
26 self._callback = callback
27 self._interval = interval
Allen Li26d10082016-12-16 16:31:02 -080028
Alex Klein1699fab2022-09-08 08:46:06 -060029 def loop_once(self):
30 """Do actions for a single loop."""
31 try:
32 self._callback()
33 except Exception:
34 logger.exception("Error during loop.")
Allen Li26d10082016-12-16 16:31:02 -080035
Alex Klein1699fab2022-09-08 08:46:06 -060036 def loop_forever(self):
37 while True:
38 self.loop_once()
39 _force_sleep(self._interval)
Allen Li26d10082016-12-16 16:31:02 -080040
41
42def _force_sleep(secs):
Alex Klein1699fab2022-09-08 08:46:06 -060043 """Force sleep for at least the given number of seconds."""
Allen Li26d10082016-12-16 16:31:02 -080044 now = time.time()
Alex Klein1699fab2022-09-08 08:46:06 -060045 finished_time = now + secs
46 while now < finished_time:
47 remaining = finished_time - now
48 logger.debug("Sleeping for %d, %d remaining", secs, remaining)
49 time.sleep(remaining)
50 now = time.time()