blob: b47242345cb2438ea880a8f1b605416391f0aced [file] [log] [blame]
Allen Li26d10082016-12-16 16:31:02 -08001# Copyright 2016 The Chromium OS Authors. All rights reserved.
2# 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 -08008from __future__ import print_function
Allen Li13bdf0c2017-03-02 15:18:16 -08009from __future__ import unicode_literals
Allen Li26d10082016-12-16 16:31:02 -080010
11import time
12
13from chromite.lib import cros_logging as logging
14
15logger = logging.getLogger(__name__)
16
17
18class SleepLoop(object):
19 """Sleep loop."""
20
21 def __init__(self, callback, interval=60):
22 """Initialize instance.
23
24 Args:
25 callback: Function to call on each loop.
26 interval: Time between loops in seconds.
27 """
28 self._callback = callback
29 self._interval = interval
Allen Li26d10082016-12-16 16:31:02 -080030
31 def loop_once(self):
32 """Do actions for a single loop."""
33 try:
Allen Li38de6412016-12-16 16:52:45 -080034 self._callback()
Allen Li26d10082016-12-16 16:31:02 -080035 except Exception:
36 logger.exception('Error during loop.')
37
38 def loop_forever(self):
39 while True:
40 self.loop_once()
41 _force_sleep(self._interval)
Allen Li26d10082016-12-16 16:31:02 -080042
43
44def _force_sleep(secs):
45 """Force sleep for at least the given number of seconds."""
46 now = time.time()
47 finished_time = now + secs
48 while now < finished_time:
49 remaining = finished_time - now
50 logger.debug('Sleeping for %d, %d remaining', secs, remaining)
51 time.sleep(remaining)
52 now = time.time()