Commit 084f2c4b419839e4954ff78290a84843ff092a97

Edward Thomson 2016-03-09T14:51:13

Merge pull request #3668 from libgit2/cmn/mwindow-try-harder mwindow: free unused windows if we fail to mmap

diff --git a/src/mwindow.c b/src/mwindow.c
index 55c8d89..d3e9be7 100644
--- a/src/mwindow.c
+++ b/src/mwindow.c
@@ -296,8 +296,18 @@ static git_mwindow *new_window(
 	 */
 
 	if (git_futils_mmap_ro(&w->window_map, fd, w->offset, (size_t)len) < 0) {
-		git__free(w);
-		return NULL;
+		/*
+		 * The first error might be down to memory fragmentation even if
+		 * we're below our soft limits, so free up what we can and try again.
+		 */
+
+		while (git_mwindow_close_lru(mwf) == 0)
+			/* nop */;
+
+		if (git_futils_mmap_ro(&w->window_map, fd, w->offset, (size_t)len) < 0) {
+			git__free(w);
+			return NULL;
+		}
 	}
 
 	ctl->mmap_calls++;