1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# Copyright 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)"""WatchdogTimer timeout objects."""
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import time
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class WatchdogTimer(object):
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  """A resetable timeout-based watchdog.
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  This object is threadsafe.
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  """
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def __init__(self, timeout):
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    """Initializes the watchdog.
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Args:
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      timeout: The timeout in seconds. If timeout is None it will never timeout.
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    """
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    self._start_time = time.time()
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    self._timeout = timeout
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def Reset(self):
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    """Resets the timeout countdown."""
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    self._start_time = time.time()
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def IsTimedOut(self):
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    """Whether the watchdog has timed out.
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Returns:
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      True if the watchdog has timed out, False otherwise.
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    """
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if self._timeout is None:
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return False
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return time.time() - self._start_time > self._timeout
38