summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@github.com>2016-03-09 14:51:13 +0000
committerEdward Thomson <ethomson@github.com>2016-03-09 14:51:13 +0000
commit084f2c4b419839e4954ff78290a84843ff092a97 (patch)
tree4e19835a3cb757961b43dba9351da390b43e7efc
parentc68044a8797d6eac5c8468dd5bec53d07b3ad66c (diff)
parentd50fd57174f98b7786a5d2ae13df5d98b07e81ee (diff)
downloadlibgit2-084f2c4b419839e4954ff78290a84843ff092a97.tar.gz
Merge pull request #3668 from libgit2/cmn/mwindow-try-harder
mwindow: free unused windows if we fail to mmap
-rw-r--r--src/mwindow.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/mwindow.c b/src/mwindow.c
index 55c8d894b..d3e9be78b 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++;