| # Copyright 2013 The Chromium Authors. All rights reserved. | 
 | # Use of this source code is governed by a BSD-style license that can be | 
 | # found in the LICENSE file. | 
 |  | 
 | """WatchdogTimer timeout objects.""" | 
 |  | 
 | import time | 
 |  | 
 |  | 
 | class WatchdogTimer(object): | 
 |   """A resetable timeout-based watchdog. | 
 |  | 
 |   This object is threadsafe. | 
 |   """ | 
 |  | 
 |   def __init__(self, timeout): | 
 |     """Initializes the watchdog. | 
 |  | 
 |     Args: | 
 |       timeout: The timeout in seconds. If timeout is None it will never timeout. | 
 |     """ | 
 |     self._start_time = time.time() | 
 |     self._timeout = timeout | 
 |  | 
 |   def Reset(self): | 
 |     """Resets the timeout countdown.""" | 
 |     self._start_time = time.time() | 
 |  | 
 |   def GetElapsed(self): | 
 |     """Returns the elapsed time of the watchdog.""" | 
 |     return time.time() - self._start_time | 
 |  | 
 |   def GetRemaining(self): | 
 |     """Returns the remaining time of the watchdog.""" | 
 |     if self._timeout: | 
 |       return self._timeout - self.GetElapsed() | 
 |     else: | 
 |       return None | 
 |  | 
 |   def IsTimedOut(self): | 
 |     """Whether the watchdog has timed out. | 
 |  | 
 |     Returns: | 
 |       True if the watchdog has timed out, False otherwise. | 
 |     """ | 
 |     remaining = self.GetRemaining() | 
 |     return remaining is not None and remaining < 0 |