[libvirt PATCH 02/10] clang-tidy: Run in parallel

Tim Wiederhake twiederh at redhat.com
Fri Feb 12 13:25:26 UTC 2021


Similar to the "official" run-clang-tidy script. Defaults to run one thread
per core, making the tool more pleasant to use locally.

Signed-off-by: Tim Wiederhake <twiederh at redhat.com>
---
 scripts/run-clang-tidy.py | 38 +++++++++++++++++++++++++++++---------
 1 file changed, 29 insertions(+), 9 deletions(-)

diff --git a/scripts/run-clang-tidy.py b/scripts/run-clang-tidy.py
index 10c8b80fe0..79d9fb38b2 100755
--- a/scripts/run-clang-tidy.py
+++ b/scripts/run-clang-tidy.py
@@ -2,9 +2,12 @@
 
 import argparse
 import json
+import multiprocessing
 import os
+import queue
 import subprocess
 import sys
+import threading
 
 
 def parse_args():
@@ -14,6 +17,12 @@ def parse_args():
         dest="build_dir",
         default=".",
         help="Path to build directory")
+    parser.add_argument(
+        "-j",
+        dest="thread_num",
+        default=multiprocessing.cpu_count(),
+        type=int,
+        help="Number of threads to run")
 
     return parser.parse_args()
 
@@ -38,28 +47,39 @@ def run_clang_tidy(item):
 
 
 def worker():
-    for item in items:
+    while True:
+        item = items.get()
         os.chdir(item["directory"])
 
         print(item["file"])
 
         result = run_clang_tidy(item)
 
-        if result["returncode"] != 0:
-            findings.append(item["file"])
-        if result["stdout"]:
-            print(result["stdout"])
-        if result["stderr"]:
-            print(result["stderr"])
+        with lock:
+            if result["returncode"] != 0:
+                findings.append(item["file"])
+            if result["stdout"]:
+                print(result["stdout"])
+            if result["stderr"]:
+                print(result["stderr"])
+
+        items.task_done()
 
 
 args = parse_args()
+items = queue.Queue()
+lock = threading.Lock()
 findings = list()
 
+for _ in range(args.thread_num):
+    threading.Thread(target=worker, daemon=True).start()
+
 with open(os.path.join(args.build_dir, "compile_commands.json")) as f:
-    items = json.load(f)
+    compile_commands = json.load(f)
+    for compile_command in compile_commands:
+        items.put(compile_command)
 
-worker()
+items.join()
 
 if findings:
     print("Findings in %s file(s):" % len(findings))
-- 
2.26.2




More information about the libvir-list mailing list