lit: handle late multiprocessing errors gracefully
authorAlp Toker <alp@nuanti.com>
Sat, 26 Oct 2013 08:22:44 +0000 (08:22 +0000)
committerAlp Toker <alp@nuanti.com>
Sat, 26 Oct 2013 08:22:44 +0000 (08:22 +0000)
This should be a better fix for lit multiprocessing failures, replacing the
OpenBSD and FreeBSD workarounds in r193413 and r193457.

Reference: http://bugs.python.org/issue3770

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193463 91177308-0d34-0410-b5e6-96231b3b80d8

utils/lit/lit/main.py
utils/lit/lit/run.py

index 9754f2f923935b259bcb1b4e663e90ba75a0bfb4..6f672a01eb3df368ecca3a4900251d4499c4deb4 100755 (executable)
@@ -111,8 +111,7 @@ def write_test_results(run, lit_config, testing_time, output_path):
 def main(builtinParameters = {}):
     # Use processes by default on Unix platforms.
     isWindows = platform.system() == 'Windows'
-    # multiprocessing is broken on various BSD Python versions: http://bugs.python.org/issue3770
-    useProcessesIsDefault = (not isWindows) and ('BSD' not in platform.system())
+    useProcessesIsDefault = not isWindows
 
     global options
     from optparse import OptionParser, OptionGroup
index 8642ff189270428e0e5ffe5b055a741b31c80a6a..8aaf52f1aecdc7d41e5f2e6f2c56fcaa0c02260a 100644 (file)
@@ -209,16 +209,20 @@ class Run(object):
         """
 
         # Choose the appropriate parallel execution implementation.
-        if jobs == 1 or not use_processes or multiprocessing is None:
+        if jobs != 1 and use_processes and multiprocessing:
+            try:
+                task_impl = multiprocessing.Process
+                queue_impl = multiprocessing.Queue
+                canceled_flag =  multiprocessing.Value('i', 0)
+                consumer = MultiprocessResultsConsumer(self, display, jobs)
+            except ImportError:
+                # Workaround for BSD: http://bugs.python.org/issue3770
+                consumer = None
+        if not consumer:
             task_impl = threading.Thread
             queue_impl = queue.Queue
             canceled_flag = LockedValue(0)
             consumer = ThreadResultsConsumer(display)
-        else:
-            task_impl = multiprocessing.Process
-            queue_impl = multiprocessing.Queue
-            canceled_flag =  multiprocessing.Value('i', 0)
-            consumer = MultiprocessResultsConsumer(self, display, jobs)
 
         # Create the test provider.
         provider = TestProvider(self.tests, jobs, queue_impl, canceled_flag)