aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2006-10-30 14:27:52 -0800
committerJunio C Hamano <junkio@cox.net>2006-10-30 14:27:52 -0800
commitae86ad65757b857337f10f25ff31cb3348d3943d (patch)
tree7b1053555ce53b1395c8f6869eb982f5f431af9f
parentf5f75c652b9c2347522159a87297820103e593e4 (diff)
downloadgit-ae86ad65757b857337f10f25ff31cb3348d3943d.tar.gz
git-ae86ad65757b857337f10f25ff31cb3348d3943d.tar.xz
git-pickaxe: tighten sanity checks.
When compiled for debugging, make sure that refcnt sanity check code detects underflows in origin reference counting. Signed-off-by: Junio C Hamano <junkio@cox.net>
-rw-r--r--builtin-pickaxe.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/builtin-pickaxe.c b/builtin-pickaxe.c
index 3e7277da2..82868328a 100644
--- a/builtin-pickaxe.c
+++ b/builtin-pickaxe.c
@@ -973,7 +973,9 @@ static void assign_blame(struct scoreboard *sb, struct rev_info *revs, int opt)
if (!cmp_suspect(ent->suspect, suspect))
ent->guilty = 1;
origin_decref(suspect);
- coalesce(sb);
+
+ if (DEBUG) /* sanity */
+ sanity_check_refcnt(sb);
}
}
@@ -1341,11 +1343,14 @@ static void sanity_check_refcnt(struct scoreboard *sb)
struct blame_entry *ent;
for (ent = sb->ent; ent; ent = ent->next) {
- /* first mark the ones that haven't been checked */
+ /* Nobody should have zero or negative refcnt */
+ if (ent->suspect->refcnt <= 0)
+ baa = 1;
+ }
+ for (ent = sb->ent; ent; ent = ent->next) {
+ /* Mark the ones that haven't been checked */
if (0 < ent->suspect->refcnt)
ent->suspect->refcnt = -ent->suspect->refcnt;
- else if (!ent->suspect->refcnt)
- baa = 1;
}
for (ent = sb->ent; ent; ent = ent->next) {
/* then pick each and see if they have the the
@@ -1357,7 +1362,7 @@ static void sanity_check_refcnt(struct scoreboard *sb)
if (0 < suspect->refcnt)
continue;
- suspect->refcnt = -suspect->refcnt;
+ suspect->refcnt = -suspect->refcnt; /* Unmark */
for (found = 0, e = sb->ent; e; e = e->next) {
if (e->suspect != suspect)
continue;