Unverified Commit d333dbea by Edward Thomson Committed by GitHub

Merge pull request #6288 from libgit2/cmn/mwindow-simplifications

A couple of simplications around mwindow
parents 660e6bd5 0f594445
...@@ -186,13 +186,16 @@ int git_mwindow_free_all(git_mwindow_file *mwf) ...@@ -186,13 +186,16 @@ int git_mwindow_free_all(git_mwindow_file *mwf)
} }
/* /*
* Check if a window 'win' contains the address 'offset' * Check if a window 'win' contains both the address 'offset' and 'extra'.
*
* 'extra' is the size of the hash we're using as we always want to make sure
* that it's contained.
*/ */
int git_mwindow_contains(git_mwindow *win, off64_t offset) int git_mwindow_contains(git_mwindow *win, off64_t offset, off64_t extra)
{ {
off64_t win_off = win->offset; off64_t win_off = win->offset;
return win_off <= offset return win_off <= offset
&& offset <= (off64_t)(win_off + win->window_map.len); && (offset + extra) <= (off64_t)(win_off + win->window_map.len);
} }
#define GIT_MWINDOW__LRU -1 #define GIT_MWINDOW__LRU -1
...@@ -237,9 +240,7 @@ static bool git_mwindow_scan_recently_used( ...@@ -237,9 +240,7 @@ static bool git_mwindow_scan_recently_used(
* store it in the output parameter. If lru_window is NULL, * store it in the output parameter. If lru_window is NULL,
* it's the first loop, so store it as well. * it's the first loop, so store it as well.
*/ */
if (!lru_window || if (!lru_window || (comparison_sign * w->last_used) > lru_window->last_used) {
(comparison_sign == GIT_MWINDOW__LRU && lru_window->last_used > w->last_used) ||
(comparison_sign == GIT_MWINDOW__MRU && lru_window->last_used < w->last_used)) {
lru_window = w; lru_window = w;
lru_last = w_last; lru_last = w_last;
found = true; found = true;
...@@ -406,14 +407,13 @@ unsigned char *git_mwindow_open( ...@@ -406,14 +407,13 @@ unsigned char *git_mwindow_open(
return NULL; return NULL;
} }
if (!w || !(git_mwindow_contains(w, offset) && git_mwindow_contains(w, offset + extra))) { if (!w || !(git_mwindow_contains(w, offset, extra))) {
if (w) { if (w) {
w->inuse_cnt--; w->inuse_cnt--;
} }
for (w = mwf->windows; w; w = w->next) { for (w = mwf->windows; w; w = w->next) {
if (git_mwindow_contains(w, offset) && if (git_mwindow_contains(w, offset, extra))
git_mwindow_contains(w, offset + extra))
break; break;
} }
......
...@@ -38,7 +38,7 @@ typedef struct git_mwindow_ctl { ...@@ -38,7 +38,7 @@ typedef struct git_mwindow_ctl {
git_vector windowfiles; git_vector windowfiles;
} git_mwindow_ctl; } git_mwindow_ctl;
int git_mwindow_contains(git_mwindow *win, off64_t offset); int git_mwindow_contains(git_mwindow *win, off64_t offset, off64_t extra);
int git_mwindow_free_all(git_mwindow_file *mwf); /* locks */ int git_mwindow_free_all(git_mwindow_file *mwf); /* locks */
unsigned char *git_mwindow_open(git_mwindow_file *mwf, git_mwindow **cursor, off64_t offset, size_t extra, unsigned int *left); unsigned char *git_mwindow_open(git_mwindow_file *mwf, git_mwindow **cursor, off64_t offset, size_t extra, unsigned int *left);
int git_mwindow_file_register(git_mwindow_file *mwf); int git_mwindow_file_register(git_mwindow_file *mwf);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment