Repository: kudu
Updated Branches:
  refs/heads/master c25b7cbd8 -> a9271b05d


iwyu: run IWYU on multiple cores

This changes iwyu_tool to use a number of parallel IWYU processes equal
to the number of cores, resulting in a huge speedup for common dev
workflows.

Change-Id: I97206318943b408c6fdd5637c6ccb79ee4d87d3f
Reviewed-on: http://gerrit.cloudera.org:8080/10104
Reviewed-by: Dan Burkert <danburk...@apache.org>
Tested-by: Kudu Jenkins


Project: http://git-wip-us.apache.org/repos/asf/kudu/repo
Commit: http://git-wip-us.apache.org/repos/asf/kudu/commit/63216152
Tree: http://git-wip-us.apache.org/repos/asf/kudu/tree/63216152
Diff: http://git-wip-us.apache.org/repos/asf/kudu/diff/63216152

Branch: refs/heads/master
Commit: 6321615289c4dd35eeb0ca85b74bf6be778251aa
Parents: c25b7cb
Author: Todd Lipcon <t...@apache.org>
Authored: Wed Apr 18 12:30:42 2018 -0700
Committer: Todd Lipcon <t...@apache.org>
Committed: Wed Apr 18 23:50:58 2018 +0000

----------------------------------------------------------------------
 build-support/iwyu/iwyu_tool.py | 32 ++++++++++++++++++++++----------
 1 file changed, 22 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kudu/blob/63216152/build-support/iwyu/iwyu_tool.py
----------------------------------------------------------------------
diff --git a/build-support/iwyu/iwyu_tool.py b/build-support/iwyu/iwyu_tool.py
index 8943226..80bea51 100755
--- a/build-support/iwyu/iwyu_tool.py
+++ b/build-support/iwyu/iwyu_tool.py
@@ -70,12 +70,14 @@ Example usage with CMake:
 See iwyu_tool.py -h for more details on command-line arguments.
 """
 
-import os
-import sys
-import json
 import argparse
-import subprocess
+import json
+import multiprocessing
+from multiprocessing.pool import ThreadPool
+import os
 import re
+import subprocess
+import sys
 
 
 def iwyu_formatter(output):
@@ -144,7 +146,7 @@ def get_output(cwd, args):
     return process.communicate()[0].decode("utf-8").splitlines()
 
 
-def run_iwyu(cwd, compile_command, iwyu_args, verbose, formatter):
+def run_iwyu(cwd, compile_command, iwyu_args, verbose):
     """ Rewrite compile_command to an IWYU command, and run it. """
     compiler, _, args = compile_command.partition(' ')
     if compiler.endswith('cl.exe'):
@@ -162,7 +164,10 @@ def run_iwyu(cwd, compile_command, iwyu_args, verbose, 
formatter):
     if verbose:
         print('{}'.format(cmd_args))
 
-    formatter(get_output(cwd, cmd_args))
+    return get_output(cwd, cmd_args)
+
+
+
 
 
 def main(compilation_db_path, source_files, verbose, formatter, iwyu_args):
@@ -203,14 +208,21 @@ def main(compilation_db_path, source_files, verbose, 
formatter, iwyu_args):
                       source)
 
     # Run analysis
+    def run_iwyu_task(entry):
+        cwd, compile_command = entry['directory'], entry['command']
+        return run_iwyu(cwd, compile_command, iwyu_args, verbose)
+    pool = ThreadPool(multiprocessing.cpu_count())
     try:
-        for entry in entries:
-            cwd, compile_command = entry['directory'], entry['command']
-            run_iwyu(cwd, compile_command, iwyu_args, verbose, formatter)
+        for iwyu_output in pool.imap_unordered(run_iwyu_task, entries):
+            formatter(iwyu_output)
+    except KeyboardInterrupt as ki:
+        sys.exit(1)
     except OSError as why:
         print('ERROR: Failed to launch include-what-you-use: %s' % why)
         return 1
-
+    finally:
+        pool.terminate()
+        pool.join()
     return 0
 
 

Reply via email to