Index: tools/testrunner/local/execution.py |
diff --git a/tools/testrunner/local/execution.py b/tools/testrunner/local/execution.py |
index 2b2f876d24f06a421853e41d24f2ab1be6d5acca..d3f83eae3c8b1bc2aaae4fb2d725a3cd4fe646da 100644 |
--- a/tools/testrunner/local/execution.py |
+++ b/tools/testrunner/local/execution.py |
@@ -214,23 +214,20 @@ class Runner(object): |
def _RunInternal(self, jobs): |
pool = Pool(jobs) |
test_map = {} |
- # TODO(machenbach): Instead of filling the queue completely before |
- # pool.imap_unordered, make this a generator that already starts testing |
- # while the queue is filled. |
- queue = [] |
- queued_exception = None |
- for test in self.tests: |
- assert test.id >= 0 |
- test_map[test.id] = test |
- try: |
- queue.append([self._GetJob(test)]) |
- except Exception, e: |
- # If this failed, save the exception and re-raise it later (after |
- # all other tests have had a chance to run). |
- queued_exception = e |
- continue |
+ queued_exception = [None] |
+ def gen_tests(): |
+ for test in self.tests: |
+ assert test.id >= 0 |
+ test_map[test.id] = test |
+ try: |
+ yield [self._GetJob(test)] |
+ except Exception, e: |
+ # If this failed, save the exception and re-raise it later (after |
+ # all other tests have had a chance to run). |
+ queued_exception[0] = e |
+ continue |
try: |
- it = pool.imap_unordered(RunTest, queue) |
+ it = pool.imap_unordered(RunTest, gen_tests()) |
for result in it: |
if result.heartbeat: |
self.indicator.Heartbeat() |
@@ -252,8 +249,8 @@ class Runner(object): |
# some files might still be open. |
print "Deleting perf test data due to db corruption." |
shutil.rmtree(self.datapath) |
- if queued_exception: |
- raise queued_exception |
+ if queued_exception[0]: |
+ raise queued_exception[0] |
# Make sure that any allocations were printed in predictable mode (if we |
# ran any tests). |