Commit a0f67e4a by Edward Thomson

win32: teach p_unlink about do_with_retries

parent 8a4e1513
...@@ -178,6 +178,26 @@ GIT_INLINE(bool) last_error_retryable(void) ...@@ -178,6 +178,26 @@ GIT_INLINE(bool) last_error_retryable(void)
return -1; \ return -1; \
} while (0) \ } while (0) \
static int ensure_writable(wchar_t *path)
{
DWORD attrs;
if ((attrs = GetFileAttributesW(path)) == INVALID_FILE_ATTRIBUTES)
goto on_error;
if ((attrs & FILE_ATTRIBUTE_READONLY) == 0)
return 0;
if (!SetFileAttributesW(path, (attrs & ~FILE_ATTRIBUTE_READONLY)))
goto on_error;
return 0;
on_error:
set_errno();
return -1;
}
/** /**
* Truncate or extend file. * Truncate or extend file.
* *
...@@ -223,38 +243,26 @@ int p_link(const char *old, const char *new) ...@@ -223,38 +243,26 @@ int p_link(const char *old, const char *new)
return -1; return -1;
} }
int p_unlink(const char *path) GIT_INLINE(int) unlink_once(const wchar_t *path)
{ {
git_win32_path buf; if (DeleteFileW(path))
int error; return 0;
int unlink_tries;
if (git_win32_path_from_utf8(buf, path) < 0) if (last_error_retryable())
return -1; return GIT_RETRY;
/* wait up to 50ms if file is locked by another thread or process */ set_errno();
unlink_tries = 0; return -1;
while (unlink_tries < 10) { }
error = _wunlink(buf);
/* If the file could not be deleted because it was int p_unlink(const char *path)
* read-only, clear the bit and try again */ {
if (error == -1 && errno == EACCES) { git_win32_path wpath;
_wchmod(buf, 0666);
error = _wunlink(buf);
if (error == -1 && errno == EACCES) { if (git_win32_path_from_utf8(wpath, path) < 0)
Sleep(5); return -1;
unlink_tries++;
} else {
break;
}
} else {
break;
}
}
return error; do_with_retries(unlink_once(wpath), ensure_writable(wpath));
} }
int p_fsync(int fd) int p_fsync(int fd)
...@@ -749,26 +757,6 @@ int p_access(const char* path, mode_t mode) ...@@ -749,26 +757,6 @@ int p_access(const char* path, mode_t mode)
return _waccess(buf, mode & WIN32_MODE_MASK); return _waccess(buf, mode & WIN32_MODE_MASK);
} }
static int ensure_writable(wchar_t *path)
{
DWORD attrs;
if ((attrs = GetFileAttributesW(path)) == INVALID_FILE_ATTRIBUTES)
goto on_error;
if ((attrs & FILE_ATTRIBUTE_READONLY) == 0)
return 0;
if (!SetFileAttributesW(path, (attrs & ~FILE_ATTRIBUTE_READONLY)))
goto on_error;
return 0;
on_error:
set_errno();
return -1;
}
GIT_INLINE(int) rename_once(const wchar_t *from, const wchar_t *to) GIT_INLINE(int) rename_once(const wchar_t *from, const wchar_t *to)
{ {
if (MoveFileExW(from, to, MOVEFILE_REPLACE_EXISTING | MOVEFILE_COPY_ALLOWED)) if (MoveFileExW(from, to, MOVEFILE_REPLACE_EXISTING | MOVEFILE_COPY_ALLOWED))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment