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

Side by Side Diff: build/android/pylib/utils/reraiser_thread.py

Issue 290573004: [Android] Support generic parallel execution across devices. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix the parallelizer tests Created 6 years, 7 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 unified diff | Download patch
« no previous file with comments | « build/android/pylib/utils/parallelizer_test.py ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright 2013 The Chromium Authors. All rights reserved. 1 # Copyright 2013 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 """Thread and ThreadGroup that reraise exceptions on the main thread.""" 5 """Thread and ThreadGroup that reraise exceptions on the main thread."""
6 # pylint: disable=W0212 6 # pylint: disable=W0212
7 7
8 import logging 8 import logging
9 import sys 9 import sys
10 import threading 10 import threading
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 """ 49 """
50 super(ReraiserThread, self).__init__(name=name) 50 super(ReraiserThread, self).__init__(name=name)
51 if not args: 51 if not args:
52 args = [] 52 args = []
53 if not kwargs: 53 if not kwargs:
54 kwargs = {} 54 kwargs = {}
55 self.daemon = True 55 self.daemon = True
56 self._func = func 56 self._func = func
57 self._args = args 57 self._args = args
58 self._kwargs = kwargs 58 self._kwargs = kwargs
59 self._ret = None
59 self._exc_info = None 60 self._exc_info = None
60 61
61 def ReraiseIfException(self): 62 def ReraiseIfException(self):
62 """Reraise exception if an exception was raised in the thread.""" 63 """Reraise exception if an exception was raised in the thread."""
63 if self._exc_info: 64 if self._exc_info:
64 raise self._exc_info[0], self._exc_info[1], self._exc_info[2] 65 raise self._exc_info[0], self._exc_info[1], self._exc_info[2]
65 66
67 def GetReturnValue(self):
68 """Reraise exception if present, otherwise get the return value."""
69 self.ReraiseIfException()
70 return self._ret
71
66 #override 72 #override
67 def run(self): 73 def run(self):
68 """Overrides Thread.run() to add support for reraising exceptions.""" 74 """Overrides Thread.run() to add support for reraising exceptions."""
69 try: 75 try:
70 self._func(*self._args, **self._kwargs) 76 self._ret = self._func(*self._args, **self._kwargs)
71 except: 77 except:
72 self._exc_info = sys.exc_info() 78 self._exc_info = sys.exc_info()
73 raise 79 raise
74 80
75 81
76 class ReraiserThreadGroup(object): 82 class ReraiserThreadGroup(object):
77 """A group of ReraiserThread objects.""" 83 """A group of ReraiserThread objects."""
78 84
79 def __init__(self, threads=None): 85 def __init__(self, threads=None):
80 """Initialize thread group. 86 """Initialize thread group.
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
131 137
132 Args: 138 Args:
133 watcher: Watchdog object providing timeout, by default waits forever. 139 watcher: Watchdog object providing timeout, by default waits forever.
134 """ 140 """
135 try: 141 try:
136 self._JoinAll(watcher) 142 self._JoinAll(watcher)
137 except TimeoutError: 143 except TimeoutError:
138 for thread in (t for t in self._threads if t.isAlive()): 144 for thread in (t for t in self._threads if t.isAlive()):
139 LogThreadStack(thread) 145 LogThreadStack(thread)
140 raise 146 raise
147
148 def GetAllReturnValues(self, watcher=watchdog_timer.WatchdogTimer(None)):
149 """Get all return values, joining all threads if necessary.
150
151 Args:
152 watcher: same as in |JoinAll|. Only used if threads are alive.
153 """
154 if any([t.isAlive() for t in self._threads]):
155 self.JoinAll(watcher)
156 return [t.GetReturnValue() for t in self._threads]
157
OLDNEW
« no previous file with comments | « build/android/pylib/utils/parallelizer_test.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698