diff options
author | Edward Thomson <ethomson@github.com> | 2016-03-09 14:51:13 +0000 |
---|---|---|
committer | Edward Thomson <ethomson@github.com> | 2016-03-09 14:51:13 +0000 |
commit | 084f2c4b419839e4954ff78290a84843ff092a97 (patch) | |
tree | 4e19835a3cb757961b43dba9351da390b43e7efc | |
parent | c68044a8797d6eac5c8468dd5bec53d07b3ad66c (diff) | |
parent | d50fd57174f98b7786a5d2ae13df5d98b07e81ee (diff) | |
download | libgit2-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.c | 14 |
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++; |