Author: stsp Date: Thu Sep 20 11:57:09 2012 New Revision: 1387987 URL: http://svn.apache.org/viewvc?rev=1387987&view=rev Log: As part of the never-ending quest of debugging multi-threaded programs:
* build/run_tests.py (TestHarness): Make the progress_func used for python tests deal with being called from multiple threads concurrently by protecting the counter of dots already printed with a mutex. * subversion/tests/cmdline/svntest/main.py (TestSpawningThread): Remove mutex here, shouldn't be needed anymore. Suggested by: philip Modified: subversion/trunk/build/run_tests.py subversion/trunk/subversion/tests/cmdline/svntest/main.py Modified: subversion/trunk/build/run_tests.py URL: http://svn.apache.org/viewvc/subversion/trunk/build/run_tests.py?rev=1387987&r1=1387986&r2=1387987&view=diff ============================================================================== --- subversion/trunk/build/run_tests.py (original) +++ subversion/trunk/build/run_tests.py Thu Sep 20 11:57:09 2012 @@ -45,7 +45,7 @@ separated list of test numbers; the defa # A few useful constants SVN_VER_MINOR = 8 -import os, re, subprocess, sys, imp +import os, re, subprocess, sys, imp, threading from datetime import datetime import getopt @@ -490,17 +490,23 @@ class TestHarness: os.dup2(self.log.fileno(), sys.stdout.fileno()) os.dup2(self.log.fileno(), sys.stderr.fileno()) - # This has to be class-scoped for use in the progress_func() + # These have to be class-scoped for use in the progress_func() self.dots_written = 0 + self.progress_lock = threading.Lock() def progress_func(completed, total): - if not self.log or self.dots_written >= dot_count: + """Report test suite progress. Can be called from multiple threads + in parallel mode.""" + if not self.log: return dots = (completed * dot_count) / total if dots > dot_count: dots = dot_count - dots_to_write = dots - self.dots_written - os.write(old_stdout, '.' * dots_to_write) - self.dots_written = dots + self.progress_lock.acquire() + if self.dots_written < dot_count: + dots_to_write = dots - self.dots_written + self.dots_written = dots + os.write(old_stdout, '.' * dots_to_write) + self.progress_lock.release() serial_only = hasattr(prog_mod, 'serial_only') and prog_mod.serial_only Modified: subversion/trunk/subversion/tests/cmdline/svntest/main.py URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/svntest/main.py?rev=1387987&r1=1387986&r2=1387987&view=diff ============================================================================== --- subversion/trunk/subversion/tests/cmdline/svntest/main.py (original) +++ subversion/trunk/subversion/tests/cmdline/svntest/main.py Thu Sep 20 11:57:09 2012 @@ -1232,7 +1232,6 @@ class TestSpawningThread(threading.Threa def __init__(self, queue, progress_func, tests_total): threading.Thread.__init__(self) self.queue = queue - self.lock = threading.Lock() self.results = [] self.progress_func = progress_func self.tests_total = tests_total @@ -1240,21 +1239,16 @@ class TestSpawningThread(threading.Threa def run(self): while True: try: - self.lock.acquire() next_index = self.queue.get_nowait() except queue.Empty: return - finally: - self.lock.release() self.run_one(next_index) # signal progress if self.progress_func: - self.lock.acquire() self.progress_func(self.tests_total - self.queue.qsize(), self.tests_total) - self.lock.release() def run_one(self, index): command = os.path.abspath(sys.argv[0])