| Index: tools/testrunner/local/execution.py
|
| diff --git a/tools/testrunner/local/execution.py b/tools/testrunner/local/execution.py
|
| index f4a40204e4889374fe9b94f9c0a628974dbd289d..80d881bc0e3229f24be3fe427c046f6058120ede 100644
|
| --- a/tools/testrunner/local/execution.py
|
| +++ b/tools/testrunner/local/execution.py
|
| @@ -26,19 +26,14 @@
|
| # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
|
| -import multiprocessing
|
| import os
|
| -import threading
|
| import time
|
|
|
| +from pool import Pool
|
| from . import commands
|
| from . import utils
|
|
|
|
|
| -BREAK_NOW = -1
|
| -EXCEPTION = -2
|
| -
|
| -
|
| class Job(object):
|
| def __init__(self, command, dep_command, test_id, timeout, verbose):
|
| self.command = command
|
| @@ -49,24 +44,17 @@ class Job(object):
|
|
|
|
|
| def RunTest(job):
|
| - try:
|
| - start_time = time.time()
|
| - if job.dep_command is not None:
|
| - dep_output = commands.Execute(job.dep_command, job.verbose, job.timeout)
|
| - # TODO(jkummerow): We approximate the test suite specific function
|
| - # IsFailureOutput() by just checking the exit code here. Currently
|
| - # only cctests define dependencies, for which this simplification is
|
| - # correct.
|
| - if dep_output.exit_code != 0:
|
| - return (job.id, dep_output, time.time() - start_time)
|
| - output = commands.Execute(job.command, job.verbose, job.timeout)
|
| - return (job.id, output, time.time() - start_time)
|
| - except KeyboardInterrupt:
|
| - return (-1, BREAK_NOW, 0)
|
| - except Exception, e:
|
| - print(">>> EXCEPTION: %s" % e)
|
| - return (-1, EXCEPTION, 0)
|
| -
|
| + start_time = time.time()
|
| + if job.dep_command is not None:
|
| + dep_output = commands.Execute(job.dep_command, job.verbose, job.timeout)
|
| + # TODO(jkummerow): We approximate the test suite specific function
|
| + # IsFailureOutput() by just checking the exit code here. Currently
|
| + # only cctests define dependencies, for which this simplification is
|
| + # correct.
|
| + if dep_output.exit_code != 0:
|
| + return (job.id, dep_output, time.time() - start_time)
|
| + output = commands.Execute(job.command, job.verbose, job.timeout)
|
| + return (job.id, output, time.time() - start_time)
|
|
|
| class Runner(object):
|
|
|
| @@ -83,8 +71,6 @@ class Runner(object):
|
| self.remaining = num_tests
|
| self.failed = []
|
| self.crashed = 0
|
| - self.terminate = False
|
| - self.lock = threading.Lock()
|
|
|
| def Run(self, jobs):
|
| self.indicator.Starting()
|
| @@ -95,8 +81,11 @@ class Runner(object):
|
| return 0
|
|
|
| def _RunInternal(self, jobs):
|
| - pool = multiprocessing.Pool(processes=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:
|
| @@ -119,22 +108,11 @@ class Runner(object):
|
| else:
|
| dep_command = None
|
| job = Job(command, dep_command, test.id, timeout, self.context.verbose)
|
| - queue.append(job)
|
| + queue.append([job])
|
| try:
|
| - kChunkSize = 1
|
| - it = pool.imap_unordered(RunTest, queue, kChunkSize)
|
| + it = pool.imap_unordered(RunTest, queue)
|
| for result in it:
|
| - test_id = result[0]
|
| - if test_id < 0:
|
| - if result[1] == BREAK_NOW:
|
| - self.terminate = True
|
| - else:
|
| - continue
|
| - if self.terminate:
|
| - pool.terminate()
|
| - pool.join()
|
| - raise BreakNowException("User pressed Ctrl+C or IO went wrong")
|
| - test = test_map[test_id]
|
| + test = test_map[result[0]]
|
| self.indicator.AboutToRun(test)
|
| test.output = result[1]
|
| test.duration = result[2]
|
| @@ -147,18 +125,10 @@ class Runner(object):
|
| self.succeeded += 1
|
| self.remaining -= 1
|
| self.indicator.HasRun(test, has_unexpected_output)
|
| - except KeyboardInterrupt:
|
| - pool.terminate()
|
| - pool.join()
|
| - raise
|
| - except Exception, e:
|
| - print("Exception: %s" % e)
|
| + finally:
|
| pool.terminate()
|
| - pool.join()
|
| - raise
|
| if queued_exception:
|
| raise queued_exception
|
| - return
|
|
|
|
|
| def GetCommand(self, test):
|
|
|