summaryrefslogtreecommitdiffstats
path: root/llvm/utils
diff options
context:
space:
mode:
authorNAKAMURA Takumi <geek4civic@gmail.com>2011-11-28 01:55:01 +0000
committerNAKAMURA Takumi <geek4civic@gmail.com>2011-11-28 01:55:01 +0000
commit57fc5adca03d61b4447097a95255c9e4d1755408 (patch)
treea72d8211804f8ac1bc851833d1e2c6f896856d8d /llvm/utils
parentcc23eb6fbf9fd540d29992f75271f692ba6c7abd (diff)
downloadbcm5719-llvm-57fc5adca03d61b4447097a95255c9e4d1755408.tar.gz
bcm5719-llvm-57fc5adca03d61b4447097a95255c9e4d1755408.zip
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. llvm-svn: 145222
Diffstat (limited to 'llvm/utils')
-rw-r--r--llvm/utils/lit/lit/TestRunner.py43
1 files changed, 43 insertions, 0 deletions
diff --git a/llvm/utils/lit/lit/TestRunner.py b/llvm/utils/lit/lit/TestRunner.py
index f5f7c19891b..b450c33df62 100644
--- a/llvm/utils/lit/lit/TestRunner.py
+++ b/llvm/utils/lit/lit/TestRunner.py
@@ -23,6 +23,41 @@ kUseCloseFDs = not kIsWindows
# 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 @@ def executeShCmd(cmd, cfg, cwd, results):
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 @@ def executeShCmd(cmd, cfg, cwd, results):
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 @@ def executeShCmd(cmd, cfg, cwd, results):
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:
OpenPOWER on IntegriCloud