BaseTools: loop to retry remove when it fails.

There is a common race condition when the OS fails to release a file
fast enough.  this adds a retry loop.

v2 - Add a timeout.

Cc: Mike Kinney <michael.d.kinney@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Cc: Yonghong Zhu <yonghong.zhu@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Jaben Carsey <jaben.carsey@intel.com>
Reviewed-by: Yonghong Zhu <yonghong.zhu@intel.com>
This commit is contained in:
Jaben Carsey 2018-05-10 23:14:40 +08:00 committed by Yonghong Zhu
parent 03ac238b1f
commit efa88d51da
1 changed files with 10 additions and 2 deletions

View File

@ -1,7 +1,7 @@
## @file ## @file
# Override built in module os to provide support for long file path # Override built in module os to provide support for long file path
# #
# Copyright (c) 2014, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>
# This program and the accompanying materials # This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License # are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at # which accompanies this distribution. The full text of the license may be found at
@ -15,6 +15,7 @@ import os
import LongFilePathOsPath import LongFilePathOsPath
from Common.LongFilePathSupport import LongFilePath from Common.LongFilePathSupport import LongFilePath
from Common.LongFilePathSupport import UniToStr from Common.LongFilePathSupport import UniToStr
import time
path = LongFilePathOsPath path = LongFilePathOsPath
@ -22,7 +23,14 @@ def access(path, mode):
return os.access(LongFilePath(path), mode) return os.access(LongFilePath(path), mode)
def remove(path): def remove(path):
return os.remove(LongFilePath(path)) Timeout = 0.0
while Timeout < 5.0:
try:
return os.remove(LongFilePath(path))
except:
time.sleep(0.1)
Timeout = Timeout + 0.1
return os.remove(LongFilePath(path))
def removedirs(name): def removedirs(name):
return os.removedirs(LongFilePath(name)) return os.removedirs(LongFilePath(name))