ref: 9600b2bd0271198a18f5acc22ed5f8bda43b3618
parent: de6910039a959291afd52305c99d15b836765990
author: Ori Bernstein <ori@eigenstate.org>
date: Fri Oct 24 18:09:02 EDT 2025
gefs: fix conditions where we skip trybalance the condition checked when entering the function was incorrect, meaning the function would never run. This could lead to less-balanced trees than we would want.
--- a/sys/src/cmd/gefs/tree.c
+++ b/sys/src/cmd/gefs/tree.c
@@ -441,15 +441,17 @@
}
}
-static Blk*
-setb(Tree *t, Blk *b)
+static void
+setb(Blk **dst, Tree *t, Blk *b)
{+ if(*dst != nil)
+ freeblk(t, *dst);
if(b->nval == 0){freeblk(t, b);
- return nil;
+ *dst = nil;
}else{enqueue(b);
- return b;
+ *dst = b;
}
}
@@ -576,7 +578,7 @@
}
p->npull = (j - up->lo);
p->op = POmod;
- p->nl = setb(t, n);
+ setb(&p->nl, t, n);
}
/*
@@ -666,7 +668,7 @@
}
p->npull = (j - up->lo);
p->op = POmod;
- p->nl = setb(t, n);
+ setb(&p->nl, t, n);
}
/*
@@ -781,8 +783,8 @@
}
p->npull = (j - up->lo);
p->op = POsplit;
- p->nl = setb(t, l);
- p->nr = setb(t, r);
+ setb(&p->nl, t, l);
+ setb(&p->nr, t, r);
poperror();
}
@@ -851,8 +853,8 @@
setmsg(d, &m);
}
p->op = POsplit;
- p->nl = setb(t, l);
- p->nr = setb(t, r);
+ setb(&p->nl, t, l);
+ setb(&p->nr, t, r);
poperror();
}
@@ -884,7 +886,7 @@
}
p->midx = idx;
pp->op = POmerge;
- pp->nl = setb(t, d);
+ setb(&pp->nl, t, d);
}
/*
@@ -993,8 +995,8 @@
}
p->midx = midx;
pp->op = POrot;
- pp->nl = setb(t, l);
- pp->nr = setb(t, r);
+ setb(&pp->nl, t, l);
+ setb(&pp->nr, t, r);
poperror();
}
@@ -1034,7 +1036,7 @@
if(p->idx == -1 || pp == nil || pp->nl == nil)
return;
- if(pp->op != POmod || pp->op != POmerge)
+ if(pp->op != POmod && pp->op != POmerge)
return;
l = nil;
--
⑨