[llvm-commits] [llvm] r145222 - /llvm/trunk/utils/lit/lit/TestRunner.py

NAKAMURA Takumi geek4civic at gmail.com
Sun Nov 27 17:55:01 PST 2011


Author: chapuni
Date: Sun Nov 27 19:55:01 2011
New Revision: 145222

URL: http://llvm.org/viewvc/llvm-project?rev=145222&view=rev
Log:
lit/TestRunner.py: [Win32] Introduce WinWaitReleased(f), to wait for file handles to be released by children.

When wait() has finished, opened handles (especially writing stdout to file) might not be released immediately.
To wait for released, poll to attempt renaming.

Modified:
    llvm/trunk/utils/lit/lit/TestRunner.py

Modified: llvm/trunk/utils/lit/lit/TestRunner.py
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/lit/lit/TestRunner.py?rev=145222&r1=145221&r2=145222&view=diff
==============================================================================
--- llvm/trunk/utils/lit/lit/TestRunner.py (original)
+++ llvm/trunk/utils/lit/lit/TestRunner.py Sun Nov 27 19:55:01 2011
@@ -23,6 +23,41 @@
 # Use temporary files to replace /dev/null on Windows.
 kAvoidDevNull = kIsWindows
 
+def RemoveForce(f):
+    try:
+        os.remove(f)
+    except OSError:
+        pass
+
+def WinRename(f_o, f_n):
+    import time
+    retry_cnt = 256
+    while (True):
+        try:
+            os.rename(f_o, f_n)
+            break
+        except WindowsError, (winerror, strerror):
+            retry_cnt = retry_cnt - 1
+            if retry_cnt <= 0:
+                raise
+            elif winerror == 32: # ERROR_SHARING_VIOLATION
+                time.sleep(0.01)
+            else:
+                raise
+
+def WinWaitReleased(f):
+    import random
+    t = "%s%06d" % (f, random.randint(0, 999999))
+    RemoveForce(t)
+    try:
+        WinRename(f, t) # rename
+        WinRename(t, f) # restore
+    except WindowsError, (winerror, strerror):
+        if winerror == 3: # ERROR_PATH_NOT_FOUND
+            pass
+        else:
+            raise
+
 def executeCommand(command, cwd=None, env=None):
     p = subprocess.Popen(command, cwd=cwd,
                          stdin=subprocess.PIPE,
@@ -68,6 +103,7 @@
     input = subprocess.PIPE
     stderrTempFiles = []
     opened_files = []
+    written_files = []
     named_temp_files = []
     # To avoid deadlock, we use a single stderr stream for piped
     # output. This is null until we have seen some output using
@@ -124,6 +160,8 @@
                     if r[1] == 'a':
                         r[2].seek(0, 2)
                     opened_files.append(r[2])
+                    if r[1] in 'aw':
+                        written_files.append(r[0])
                 result = r[2]
             final_redirects.append(result)
 
@@ -224,6 +262,11 @@
         else:
             exitCode = res
 
+    # Make sure written_files is released by other (child) processes.
+    if (kIsWindows):
+        for f in written_files:
+            WinWaitReleased(f)
+
     # Remove any named temporary files we created.
     for f in named_temp_files:
         try:





More information about the llvm-commits mailing list