return end - start
- def _consume_test_result(self, pool_result):
+ def _consume_test_result(self, test, result):
"""Test completion callback for lit.worker.run_one_test
Updates the test result status in the parent process. Each task in the
if self.hit_max_failures:
return
- (test_index, result) = pool_result
- test = self.tests[test_index]
# Update the parent process copy of the test. This includes the result,
# XFAILS, REQUIRES, and UNSUPPORTED statuses.
test.setResult(result)
def _execute(self, deadline):
# TODO(yln): ignores deadline
- for test_index, test in enumerate(self.tests):
+ for test in self.tests:
result = lit.worker._execute_test(test, self.lit_config)
- self._consume_test_result((test_index, result))
+ self._consume_test_result(test, result)
if self.hit_max_failures:
break
try:
async_results = [pool.apply_async(lit.worker.run_one_test,
- args=(test_index, test),
- callback=self._consume_test_result)
- for test_index, test in enumerate(self.tests)]
+ args=(test,),
+ callback=lambda r,t=test: self._consume_test_result(t, r))
+ for test in self.tests]
pool.close()
# Wait for all results to come in. The callback that runs in the
_lit_config = lit_config
_parallelism_semaphores = parallelism_semaphores
-def run_one_test(test_index, test):
+def run_one_test(test):
"""Run one test in a multiprocessing.Pool
Side effects in this function and functions it calls are not visible in the
Arguments and results of this function are pickled, so they should be cheap
to copy. For efficiency, we copy all data needed to execute all tests into
- each worker and store it in the worker_* global variables. This reduces the
- cost of each task.
-
- Returns an index and a Result, which the parent process uses to update
- the display.
+ each worker and store it in global variables. This reduces the cost of each
+ task.
"""
try:
- result = _execute_test_in_parallelism_group(test, _lit_config,
- _parallelism_semaphores)
- return (test_index, result)
+ return _execute_test_in_parallelism_group(test, _lit_config,
+ _parallelism_semaphores)
except KeyboardInterrupt:
# If a worker process gets an interrupt, abort it immediately.
lit.util.abort_now()