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])


Reply via email to