blob: ece318bfcc4f07448faf329559e0f12cd31c1a8d [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 -08008
9import time
10
11from chromite.lib import cros_logging as logging
12
13logger = logging.getLogger(__name__)
14
15
16class SleepLoop(object):
17 """Sleep loop."""
18
19 def __init__(self, callback, interval=60):
20 """Initialize instance.
21
22 Args:
23 callback: Function to call on each loop.
24 interval: Time between loops in seconds.
25 """
26 self._callback = callback
27 self._interval = interval
Allen Li26d10082016-12-16 16:31:02 -080028
29 def loop_once(self):
30 """Do actions for a single loop."""
31 try:
Allen Li38de6412016-12-16 16:52:45 -080032 self._callback()
Allen Li26d10082016-12-16 16:31:02 -080033 except Exception:
Allen Li867d4582017-05-24 18:00:43 -070034 logger.exception(u'Error during loop.')
Allen Li26d10082016-12-16 16:31:02 -080035
36 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):
43 """Force sleep for at least the given number of seconds."""
44 now = time.time()
45 finished_time = now + secs
46 while now < finished_time:
47 remaining = finished_time - now
Allen Li867d4582017-05-24 18:00:43 -070048 logger.debug(u'Sleeping for %d, %d remaining', secs, remaining)
Allen Li26d10082016-12-16 16:31:02 -080049 time.sleep(remaining)
50 now = time.time()