pack: move release_pack_memory()
The function unuse_one_window() needs to be temporarily made global. Its scope will be restored to static in a subsequent commit. Signed-off-by: Jonathan Tan <jonathantanmy@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
0317f45576
commit
f0e17e86e1
@ -749,8 +749,6 @@ const char *inet_ntop(int af, const void *src, char *dst, size_t size);
|
|||||||
extern int git_atexit(void (*handler)(void));
|
extern int git_atexit(void (*handler)(void));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern void release_pack_memory(size_t);
|
|
||||||
|
|
||||||
typedef void (*try_to_free_t)(size_t);
|
typedef void (*try_to_free_t)(size_t);
|
||||||
extern try_to_free_t set_try_to_free_routine(try_to_free_t);
|
extern try_to_free_t set_try_to_free_routine(try_to_free_t);
|
||||||
|
|
||||||
|
49
packfile.c
49
packfile.c
@ -208,3 +208,52 @@ struct packed_git *parse_pack_index(unsigned char *sha1, const char *idx_path)
|
|||||||
|
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void scan_windows(struct packed_git *p,
|
||||||
|
struct packed_git **lru_p,
|
||||||
|
struct pack_window **lru_w,
|
||||||
|
struct pack_window **lru_l)
|
||||||
|
{
|
||||||
|
struct pack_window *w, *w_l;
|
||||||
|
|
||||||
|
for (w_l = NULL, w = p->windows; w; w = w->next) {
|
||||||
|
if (!w->inuse_cnt) {
|
||||||
|
if (!*lru_w || w->last_used < (*lru_w)->last_used) {
|
||||||
|
*lru_p = p;
|
||||||
|
*lru_w = w;
|
||||||
|
*lru_l = w_l;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
w_l = w;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int unuse_one_window(struct packed_git *current)
|
||||||
|
{
|
||||||
|
struct packed_git *p, *lru_p = NULL;
|
||||||
|
struct pack_window *lru_w = NULL, *lru_l = NULL;
|
||||||
|
|
||||||
|
if (current)
|
||||||
|
scan_windows(current, &lru_p, &lru_w, &lru_l);
|
||||||
|
for (p = packed_git; p; p = p->next)
|
||||||
|
scan_windows(p, &lru_p, &lru_w, &lru_l);
|
||||||
|
if (lru_p) {
|
||||||
|
munmap(lru_w->base, lru_w->len);
|
||||||
|
pack_mapped -= lru_w->len;
|
||||||
|
if (lru_l)
|
||||||
|
lru_l->next = lru_w->next;
|
||||||
|
else
|
||||||
|
lru_p->windows = lru_w->next;
|
||||||
|
free(lru_w);
|
||||||
|
pack_open_windows--;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void release_pack_memory(size_t need)
|
||||||
|
{
|
||||||
|
size_t cur = pack_mapped;
|
||||||
|
while (need >= (cur - pack_mapped) && unuse_one_window(NULL))
|
||||||
|
; /* nothing */
|
||||||
|
}
|
||||||
|
@ -43,4 +43,8 @@ extern void pack_report(void);
|
|||||||
*/
|
*/
|
||||||
extern int open_pack_index(struct packed_git *);
|
extern int open_pack_index(struct packed_git *);
|
||||||
|
|
||||||
|
extern int unuse_one_window(struct packed_git *current);
|
||||||
|
|
||||||
|
extern void release_pack_memory(size_t);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
49
sha1_file.c
49
sha1_file.c
@ -681,55 +681,6 @@ static int has_loose_object(const unsigned char *sha1)
|
|||||||
return check_and_freshen(sha1, 0);
|
return check_and_freshen(sha1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void scan_windows(struct packed_git *p,
|
|
||||||
struct packed_git **lru_p,
|
|
||||||
struct pack_window **lru_w,
|
|
||||||
struct pack_window **lru_l)
|
|
||||||
{
|
|
||||||
struct pack_window *w, *w_l;
|
|
||||||
|
|
||||||
for (w_l = NULL, w = p->windows; w; w = w->next) {
|
|
||||||
if (!w->inuse_cnt) {
|
|
||||||
if (!*lru_w || w->last_used < (*lru_w)->last_used) {
|
|
||||||
*lru_p = p;
|
|
||||||
*lru_w = w;
|
|
||||||
*lru_l = w_l;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
w_l = w;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int unuse_one_window(struct packed_git *current)
|
|
||||||
{
|
|
||||||
struct packed_git *p, *lru_p = NULL;
|
|
||||||
struct pack_window *lru_w = NULL, *lru_l = NULL;
|
|
||||||
|
|
||||||
if (current)
|
|
||||||
scan_windows(current, &lru_p, &lru_w, &lru_l);
|
|
||||||
for (p = packed_git; p; p = p->next)
|
|
||||||
scan_windows(p, &lru_p, &lru_w, &lru_l);
|
|
||||||
if (lru_p) {
|
|
||||||
munmap(lru_w->base, lru_w->len);
|
|
||||||
pack_mapped -= lru_w->len;
|
|
||||||
if (lru_l)
|
|
||||||
lru_l->next = lru_w->next;
|
|
||||||
else
|
|
||||||
lru_p->windows = lru_w->next;
|
|
||||||
free(lru_w);
|
|
||||||
pack_open_windows--;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void release_pack_memory(size_t need)
|
|
||||||
{
|
|
||||||
size_t cur = pack_mapped;
|
|
||||||
while (need >= (cur - pack_mapped) && unuse_one_window(NULL))
|
|
||||||
; /* nothing */
|
|
||||||
}
|
|
||||||
|
|
||||||
static void mmap_limit_check(size_t length)
|
static void mmap_limit_check(size_t length)
|
||||||
{
|
{
|
||||||
static size_t limit = 0;
|
static size_t limit = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user