Merge branch 'np/pack' into next
authorJunio C Hamano <junkio@cox.net>
Mon, 15 May 2006 20:51:09 +0000 (13:51 -0700)
committerJunio C Hamano <junkio@cox.net>
Mon, 15 May 2006 20:51:09 +0000 (13:51 -0700)
* np/pack:
pack-object: slightly more efficient
simple euristic for further free packing improvements

delta.h
pack-objects.c
diff --git a/delta.h b/delta.h
index 727ae30e9eb973b2bd4a512be78041fee40fa039..7b3f86d85f71e47d11c40a4abbcd9d9f499a6636 100644 (file)
--- a/delta.h
+++ b/delta.h
@@ -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);
 
index 5466b1516788c878bfd3377f74dab40f73355127..b430b02cf7f5b39c97bc090634ef26346a022ade 100644 (file)
@@ -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);