diff options
author | Junio C Hamano <junkio@cox.net> | 2006-05-15 13:51:09 -0700 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-05-15 13:51:09 -0700 |
commit | 8dd84b0169864f638516b82df40b0a3ef6e2cb92 (patch) | |
tree | 6adf425ff5fae70f77d127dafe999dcf3843964c | |
parent | Merge branch 'lt/oneway' into next (diff) | |
parent | pack-object: slightly more efficient (diff) | |
download | tgif-8dd84b0169864f638516b82df40b0a3ef6e2cb92.tar.xz |
Merge branch 'np/pack' into next
* np/pack:
pack-object: slightly more efficient
simple euristic for further free packing improvements
-rw-r--r-- | delta.h | 2 | ||||
-rw-r--r-- | pack-objects.c | 22 |
2 files changed, 12 insertions, 12 deletions
@@ -18,6 +18,8 @@ create_delta_index(const void *buf, unsigned long bufsize); /* * free_delta_index: free the index created by create_delta_index() + * + * Given pointer must be what create_delta_index() returned, or NULL. */ extern void free_delta_index(struct delta_index *index); diff --git a/pack-objects.c b/pack-objects.c index 5466b15167..b430b02cf7 100644 --- a/pack-objects.c +++ b/pack-objects.c @@ -1039,8 +1039,8 @@ static int try_delta(struct unpacked *trg, struct unpacked *src, /* Now some size filtering euristics. */ size = trg_entry->size; - max_size = size / 2 - 20; - if (trg_entry->delta) + max_size = (size/2 - 20) / (src_entry->depth + 1); + if (trg_entry->delta && trg_entry->delta_size <= max_size) max_size = trg_entry->delta_size-1; src_size = src_entry->size; sizediff = src_size < size ? size - src_size : 0; @@ -1105,17 +1105,14 @@ static void find_deltas(struct object_entry **list, int window, int depth) if (entry->size < 50) continue; - if (n->index) - free_delta_index(n->index); + free_delta_index(n->index); + n->index = NULL; free(n->data); n->entry = entry; n->data = read_sha1_file(entry->sha1, type, &size); if (size != entry->size) die("object %s inconsistent object length (%lu vs %lu)", sha1_to_hex(entry->sha1), size, entry->size); - n->index = create_delta_index(n->data, size); - if (!n->index) - die("out of memory"); j = window; while (--j > 0) { @@ -1129,15 +1126,17 @@ static void find_deltas(struct object_entry **list, int window, int depth) if (try_delta(n, m, m->index, depth) < 0) break; } -#if 0 /* if we made n a delta, and if n is already at max * depth, leaving it in the window is pointless. we * should evict it first. - * ... in theory only; somehow this makes things worse. */ if (entry->delta && depth <= entry->depth) continue; -#endif + + n->index = create_delta_index(n->data, size); + if (!n->index) + die("out of memory"); + idx++; if (idx >= window) idx = 0; @@ -1147,8 +1146,7 @@ static void find_deltas(struct object_entry **list, int window, int depth) fputc('\n', stderr); for (i = 0; i < window; ++i) { - if (array[i].index) - free_delta_index(array[i].index); + free_delta_index(array[i].index); free(array[i].data); } free(array); |