git: 9front

Download patch

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;
--