mingw: add fallback for rmdir in case directory is in use

The same logic as for unlink and rename also applies to rmdir. For
example in case you have a shell open in a git controlled folder. This
will easily fail. So lets be nice for such cases as well.

Signed-off-by: Heiko Voigt <heiko.voigt@mahr.de>
This commit is contained in:
Heiko Voigt
2010-02-25 14:58:36 +01:00
committed by Johannes Schindelin
parent 42e8a6b4e0
commit 5d5a2afa39
2 changed files with 28 additions and 0 deletions

View File

@@ -232,6 +232,31 @@ int mingw_unlink(const char *pathname)
return ret;
}
#undef rmdir
int mingw_rmdir(const char *pathname)
{
int ret, tries = 0;
while ((ret = rmdir(pathname)) == -1 && tries < ARRAY_SIZE(delay)) {
if (errno != EACCES)
break;
/*
* We assume that some other process had the source or
* destination file open at the wrong moment and retry.
* In order to give the other process a higher chance to
* complete its operation, we give up our time slice now.
* If we have to retry again, we do sleep a bit.
*/
Sleep(delay[tries]);
tries++;
}
while (ret == -1 && errno == EACCES &&
ask_user_yes_no("Deletion of directory '%s' failed. "
"Should I try again?", pathname))
ret = rmdir(pathname);
return ret;
}
#undef open
int mingw_open (const char *filename, int oflags, ...)
{

View File

@@ -172,6 +172,9 @@ int link(const char *oldpath, const char *newpath);
int mingw_unlink(const char *pathname);
#define unlink mingw_unlink
int mingw_rmdir(const char *path);
#define rmdir mingw_rmdir
int mingw_open (const char *filename, int oflags, ...);
#define open mingw_open