From: pclouds@gmail.com
To: git@vger.kernel.org
Cc: "Junio C Hamano" <gitster@pobox.com>,
"Shawn Pearce" <spearce@spearce.org>,
"Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
Subject: [PATCH 2/2] index-pack: a naive attempt to flatten find_unresolved_deltas
Date: Thu, 8 Dec 2011 20:40:38 +0700 [thread overview]
Message-ID: <4ee0be70.44f2320a.3fe8.632b@mx.google.com> (raw)
In-Reply-To: <1323351638-4790-1-git-send-email-y>
From: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
This seems to work for me. But I think this approach uses (much?) more
memory because it turns a tree of calls into a flat list of calls and
keep the list until the end, while the recursive version only has to
keep one call chain at a time.
Any ideas how to improve it?
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
builtin/index-pack.c | 57 +++++++++++++++++++++++++++++++++++++------------
1 files changed, 43 insertions(+), 14 deletions(-)
diff --git a/builtin/index-pack.c b/builtin/index-pack.c
index 9855ada..d4c182f 100644
--- a/builtin/index-pack.c
+++ b/builtin/index-pack.c
@@ -565,18 +565,31 @@ static void resolve_delta(struct object_entry *delta_obj,
nr_resolved_deltas++;
}
+struct fud_stack {
+ struct base_data base_;
+ struct base_data *base;
+ struct base_data *prev_base;
+};
+
static void find_unresolved_deltas(struct base_data *base,
struct base_data *prev_base)
{
+ struct fud_stack **stack = NULL;
+ int stk, stack_nr = 0, stack_alloc = 0;
int i, ref_first, ref_last, ofs_first, ofs_last;
- /*
- * This is a recursive function. Those brackets should help reducing
- * stack usage by limiting the scope of the delta_base union.
- */
- {
+ ALLOC_GROW(stack, stack_nr + 1, stack_alloc);
+ stack[stack_nr] = xmalloc(sizeof(struct fud_stack));
+ stack[stack_nr]->base = base;
+ stack[stack_nr]->prev_base = prev_base;
+ stack_nr++;
+
+ for (stk = 0; stk < stack_nr; stk++) {
union delta_base base_spec;
+ base = stack[stk]->base;
+ prev_base = stack[stk]->prev_base;
+
hashcpy(base_spec.sha1, base->obj->idx.sha1);
find_delta_children(&base_spec,
&ref_first, &ref_last, OBJ_REF_DELTA);
@@ -588,34 +601,50 @@ static void find_unresolved_deltas(struct base_data *base,
if (ref_last == -1 && ofs_last == -1) {
free(base->data);
- return;
+ free(stack[stk]);
+ stack[stk] = NULL;
+ continue;
}
link_base_data(prev_base, base);
+ ALLOC_GROW(stack, stack_nr +
+ (ref_last - ref_first + 1) +
+ (ofs_last - ofs_first + 1),
+ stack_alloc);
+
for (i = ref_first; i <= ref_last; i++) {
struct object_entry *child = objects + deltas[i].obj_no;
- struct base_data result;
assert(child->real_type == OBJ_REF_DELTA);
- resolve_delta(child, base, &result);
+ stack[stack_nr] = xmalloc(sizeof(struct fud_stack));
+ stack[stack_nr]->base = &stack[stack_nr]->base_;
+ resolve_delta(child, base, stack[stack_nr]->base);
if (i == ref_last && ofs_last == -1)
free_base_data(base);
- find_unresolved_deltas(&result, base);
+ stack[stack_nr]->prev_base = base;
+ stack_nr++;
}
for (i = ofs_first; i <= ofs_last; i++) {
struct object_entry *child = objects + deltas[i].obj_no;
- struct base_data result;
-
assert(child->real_type == OBJ_OFS_DELTA);
- resolve_delta(child, base, &result);
+ stack[stack_nr] = xmalloc(sizeof(struct fud_stack));
+ stack[stack_nr]->base = &stack[stack_nr]->base_;
+ resolve_delta(child, base, stack[stack_nr]->base);
if (i == ofs_last)
free_base_data(base);
- find_unresolved_deltas(&result, base);
+ stack[stack_nr]->prev_base = base;
+ stack_nr++;
}
}
- unlink_base_data(base);
+
+ for (stk = stack_nr - 1; stk >= 0; stk--)
+ if (stack[stk]) {
+ unlink_base_data(stack[stk]->base);
+ free(stack[stk]);
+ }
+ free(stack);
}
static int compare_delta_entry(const void *a, const void *b)
--
1.7.8.36.g69ee2
next prev parent reply other threads:[~2011-12-08 13:41 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-12-05 7:04 [PATCH] Set hard limit on delta chain depth Nguyễn Thái Ngọc Duy
2011-12-06 12:17 ` Erik Faye-Lund
2011-12-06 12:32 ` Nguyen Thai Ngoc Duy
2011-12-06 12:41 ` Erik Faye-Lund
2011-12-06 12:48 ` Nguyen Thai Ngoc Duy
2011-12-06 14:54 ` Michael Haggerty
2011-12-06 15:30 ` Nguyen Thai Ngoc Duy
2011-12-06 18:12 ` Shawn Pearce
2011-12-06 18:56 ` Jeff King
2011-12-06 15:06 ` Junio C Hamano
2011-12-06 15:45 ` Nguyen Thai Ngoc Duy
2011-12-10 0:02 ` Junio C Hamano
2011-12-07 17:50 ` [PATCH] index-pack: eliminate unlimited recursion in get_delta_base() Nguyễn Thái Ngọc Duy
2011-12-08 3:02 ` Shawn Pearce
2011-12-08 11:06 ` Nguyen Thai Ngoc Duy
2011-12-08 13:40 ` [PATCH 1/2] index_pack: indent find_unresolved_detals one level pclouds
2011-12-09 21:27 ` Junio C Hamano
[not found] ` <1323351638-4790-1-git-send-email-y>
2011-12-08 13:40 ` pclouds [this message]
2011-12-08 16:42 ` [PATCH 2/2] index-pack: a naive attempt to flatten find_unresolved_deltas Shawn Pearce
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4ee0be70.44f2320a.3fe8.632b@mx.google.com \
--to=pclouds@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=spearce@spearce.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.