Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(387)

Unified Diff: build/android/pylib/utils/timeout_retry.py

Issue 636273004: Make TimeoutRetryThread's stoppable (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: do not catch CommandFailedError in _WaitFor Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: build/android/pylib/utils/timeout_retry.py
diff --git a/build/android/pylib/utils/timeout_retry.py b/build/android/pylib/utils/timeout_retry.py
index bae8b16cf7ffd5b16b32e849ffb1af26bf290ead..3a3846d892db401d69aa5351a59333d853171580 100644
--- a/build/android/pylib/utils/timeout_retry.py
+++ b/build/android/pylib/utils/timeout_retry.py
@@ -12,7 +12,55 @@ from pylib.utils import watchdog_timer
class TimeoutRetryThread(reraiser_thread.ReraiserThread):
jbudorick 2014/10/30 02:27:03 This interface feels bloated. Why can't we just na
perezju 2014/10/30 18:44:45 Yeah ..., have a look at the new one. I hope it's
- pass
+ def __init__(self, func, timeout, name):
+ super(TimeoutRetryThread, self).__init__(func, name=name)
+ self._watcher = watchdog_timer.WatchdogTimer(timeout)
+
+ def GetWatcher(self):
+ """Returns the watchdog timer keeping track of this thread's time."""
+ return self._watcher
+
+ def ElapsedTime(self):
+ """Returns the number of seconds elapsed since the thread started."""
+ return self._watcher.ElapsedTime()
+
+ def RemainingTime(self):
+ """Returns the number of seconds remaining until the thread times out.
+
+ Raises:
+ reraiser_thread.TimeoutError if there is no remaining time.
+ """
+ remaining = self._watcher.RemainingTime()
+ if remaining is not None and remaining <= 0:
+ self.RaiseTimeout()
+ return remaining
+
+ def CheckTimeout(self):
+ """Checks if thread should time out.
+
+ Raises:
+ reraiser_thread.TimeoutError if the thread has timed out.
+ """
+ if self._watcher.IsTimedOut():
+ self.RaiseTimeout()
+
+ def RaiseTimeout(self):
+ """Raises the thread time out error."""
+ reraiser_thread.LogThreadStack(self)
perezju 2014/10/29 18:16:50 Note, we need to log here because the thread is go
+ raise reraiser_thread.TimeoutError('%s timed out' % self.name)
+
+
+def GetTimeoutThread():
jbudorick 2014/10/30 02:27:03 Nit: rename this, it sounds like it's creating a t
perezju 2014/10/30 18:44:45 Done.
+ """Get the current thread if it is a TimeoutRetryThread.
+
+ Returns:
+ The current thread if it is a TimeoutRetryThread, otherwise None.
+ """
+ current_thread = threading.current_thread()
+ if isinstance(current_thread, TimeoutRetryThread):
+ return current_thread
+ else:
+ return None
def Run(func, timeout, retries, args=None, kwargs=None):
@@ -40,15 +88,18 @@ def Run(func, timeout, retries, args=None, kwargs=None):
def RunOnTimeoutThread():
ret[0] = func(*args, **kwargs)
+ num_try = 1
jbudorick 2014/10/30 02:27:03 I'm guessing you're trying to "correct" the retrie
perezju 2014/10/30 18:44:45 Mmm, nope, this was also the original behavior. Th
while True:
+ child_thread = TimeoutRetryThread(
+ RunOnTimeoutThread, timeout,
+ name='TimeoutThread-%d-for-%s' % (num_try,
+ threading.current_thread().name))
try:
- name = 'TimeoutThread-for-%s' % threading.current_thread().name
- thread_group = reraiser_thread.ReraiserThreadGroup(
- [TimeoutRetryThread(RunOnTimeoutThread, name=name)])
+ thread_group = reraiser_thread.ReraiserThreadGroup([child_thread])
thread_group.StartAll()
- thread_group.JoinAll(watchdog_timer.WatchdogTimer(timeout))
+ thread_group.JoinAll(child_thread.GetWatcher())
perezju 2014/10/29 18:16:50 This is so that both the thread_group and the time
return ret[0]
except:
- if retries <= 0:
+ if num_try > retries:
raise
- retries -= 1
+ num_try += 1

Powered by Google App Engine
This is Rietveld 408576698