git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v3 2/8] mingw: work around irregular failures of unlink on windows

From
Heiko Voigt <hvoigt@hvoigt.net>
Date
Dec 14, 2010, 22:11 UTC
Message-ID
<20101214221134.GC4084@sandbox>
In-Reply-To
<20101214220604.GA4084@sandbox>

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 6ac6f878.

Signed-off-by: Heiko Voigt <hvoigt@hvoigt.net>
---
 compat/mingw.c |   31 +++++++++++++++++++++++++++++--
 1 files changed, 29 insertions(+), 2 deletions(-)
diff --git a/compat/mingw.c b/compat/mingw.c
index a7e1c6b..52183a7 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -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;
@@ -116,12 +118,38 @@ int err_win_to_posix(DWORD winerr)
 	return error;
 }
 
+static inline int is_file_in_use_error(DWORD errcode)
+{
+	switch(GetLastError()) {
+	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
@@ -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.
-- 
1.7.3.3.566.gf422f
Previous: Heiko VoigtNext: Erik Faye-Lund
Message 3 of 34 in “make open/unlink failures user friendly on windows using retry/abort”
  1. 0/5 make open/unlink failures user friendly on windows using retry/abortHeiko Voigt, Dec 14, 2010
  2. 1/8 mingw: move unlink wrapper to mingw.cHeiko Voigt, Dec 14, 2010
  3. 2/8 mingw: work around irregular failures of unlink on windowsHeiko Voigt, Dec 14, 2010
  4. Erik Faye-LundDec 14, 2010
  5. Heiko VoigtDec 14, 2010
  6. 2/5 mingw: work around irregular failures of unlink on windowsHeiko Voigt, Dec 14, 2010
  7. 3/8 mingw: make failures to unlink or move raise a questionHeiko Voigt, Dec 14, 2010
  8. Erik Faye-LundDec 14, 2010
  9. Junio C HamanoDec 14, 2010
  10. Heiko VoigtDec 15, 2010
  11. Johannes SchindelinDec 15, 2010
  12. Junio C HamanoDec 15, 2010
  13. Heiko VoigtDec 15, 2010
  14. Erik Faye-LundDec 15, 2010
  15. Heiko VoigtDec 15, 2010
  16. 4/5 mingw: add fallback for rmdir in case directory is in useHeiko Voigt, Dec 14, 2010
  17. 5/5 mingw_rmdir: set errno=ENOTEMPTY when appropriateHeiko Voigt, Dec 14, 2010
  18. Erik Faye-LundDec 14, 2010
  19. Johannes SchindelinDec 15, 2010
  20. Erik Faye-LundDec 15, 2010
  21. Junio C HamanoDec 15, 2010
  22. 0/5 make open/unlink failures user friendly on windows using retry/abortHeiko Voigt, Feb 7, 2011
  23. 1/5 mingw: move unlink wrapper to mingw.cHeiko Voigt, Feb 7, 2011
  24. Johannes SchindelinFeb 17, 2011
  25. 2/5 mingw: work around irregular failures of unlink on windowsHeiko Voigt, Feb 7, 2011
  26. 3/5 mingw: make failures to unlink or move raise a questionHeiko Voigt, Feb 7, 2011
  27. 4/5 mingw: add fallback for rmdir in case directory is in useHeiko Voigt, Feb 7, 2011
  28. 5/5 mingw_rmdir: set errno=ENOTEMPTY when appropriateHeiko Voigt, Feb 7, 2011
  29. Erik Faye-LundFeb 7, 2011
  30. Heiko VoigtFeb 7, 2011
  31. Erik Faye-LundFeb 7, 2011
  32. Junio C HamanoFeb 7, 2011
  33. Erik Faye-LundFeb 7, 2011
  34. Junio C HamanoFeb 8, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.