Skip to content

Commit

Permalink
mingw: work around irregular failures of unlink on windows
Browse files Browse the repository at this point in the history
If a file is opened by another process (e.g. indexing of an IDE) for
reading it is not allowed to be deleted. So in case unlink fails retry
after waiting for some time. This extends the workaround from 6ac6f87.

Signed-off-by: Heiko Voigt <hvoigt@hvoigt.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Heiko Voigt authored and Junio C Hamano committed Feb 7, 2011
1 parent 337967f commit 19e1254
Showing 1 changed file with 29 additions and 2 deletions.
31 changes: 29 additions & 2 deletions compat/mingw.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
#include <conio.h>
#include "../strbuf.h"

static const int delay[] = { 0, 1, 10, 20, 40 };

int err_win_to_posix(DWORD winerr)
{
int error = ENOSYS;
Expand Down Expand Up @@ -116,12 +118,38 @@ int err_win_to_posix(DWORD winerr)
return error;
}

static inline int is_file_in_use_error(DWORD errcode)
{
switch (errcode) {
case ERROR_SHARING_VIOLATION:
case ERROR_ACCESS_DENIED:
return 1;
}

return 0;
}

#undef unlink
int mingw_unlink(const char *pathname)
{
int ret, tries = 0;

/* read-only files cannot be removed */
chmod(pathname, 0666);
return unlink(pathname);
while ((ret = unlink(pathname)) == -1 && tries < ARRAY_SIZE(delay)) {
if (!is_file_in_use_error(GetLastError()))
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++;
}
return ret;
}

#undef open
Expand Down Expand Up @@ -1257,7 +1285,6 @@ int mingw_rename(const char *pold, const char *pnew)
{
DWORD attrs, gle;
int tries = 0;
static const int delay[] = { 0, 1, 10, 20, 40 };

/*
* Try native rename() first to get errno right.
Expand Down

0 comments on commit 19e1254

Please sign in to comment.