diff options
author | Tyler Church <tylertrain@yahoo.com> | 2016-05-18 09:33:17 -0700 |
---|---|---|
committer | Tyler Church <tylertrain@yahoo.com> | 2016-05-18 09:33:17 -0700 |
commit | 32269b15e2fc2e5477b8ccfb724cd087c6a41ce7 (patch) | |
tree | 147cb008dfdb4ef6a6a3d5c026c28567e0fa5847 /src/win32 | |
parent | 4d384d6bbe3efc72fb212a2c5c71c8064a2cee54 (diff) | |
download | libgit2-32269b15e2fc2e5477b8ccfb724cd087c6a41ce7.tar.gz |
Add retries to win32 p_unlink and p_open.
Diffstat (limited to 'src/win32')
-rw-r--r-- | src/win32/posix_w32.c | 46 |
1 files changed, 39 insertions, 7 deletions
diff --git a/src/win32/posix_w32.c b/src/win32/posix_w32.c index fea634b00..e89b065e6 100644 --- a/src/win32/posix_w32.c +++ b/src/win32/posix_w32.c @@ -93,17 +93,31 @@ int p_unlink(const char *path) { git_win32_path buf; int error; + int unlink_tries; if (git_win32_path_from_utf8(buf, path) < 0) return -1; - error = _wunlink(buf); - - /* If the file could not be deleted because it was - * read-only, clear the bit and try again */ - if (error == -1 && errno == EACCES) { - _wchmod(buf, 0666); + /* wait up to 50ms if file is locked by another thread or process */ + unlink_tries = 0; + while (unlink_tries < 10) { error = _wunlink(buf); + + /* If the file could not be deleted because it was + * read-only, clear the bit and try again */ + if (error == -1 && errno == EACCES) { + _wchmod(buf, 0666); + error = _wunlink(buf); + + if (error == -1 && errno == EACCES) { + Sleep(5); + unlink_tries++; + } else { + break; + } + } else { + break; + } } return error; @@ -284,6 +298,8 @@ int p_open(const char *path, int flags, ...) { git_win32_path buf; mode_t mode = 0; + int open_tries; + int handle; if (git_win32_path_from_utf8(buf, path) < 0) return -1; @@ -296,7 +312,23 @@ int p_open(const char *path, int flags, ...) va_end(arg_list); } - return _wopen(buf, flags | STANDARD_OPEN_FLAGS, mode & WIN32_MODE_MASK); + /* wait up to 50ms if file is locked by another thread or process */ + open_tries = 0; + while (open_tries < 10) { + handle = _wopen(buf, flags | STANDARD_OPEN_FLAGS, mode & WIN32_MODE_MASK); + if (handle != -1) { + break; + } + + if (errno == EACCES) { + Sleep(5); + open_tries++; + } else { + break; + } + } + + return handle; } int p_creat(const char *path, mode_t mode) |