Commit Diff


commit - d4bf606d29304006a85a35a8f09d38bf1529d2af
commit + 01c1b7633c0576ad30880ce8dd96aa20e9bfdbc2
blob - d77e0ccf5f97cc77eef74f433e2651a27873cf6c
blob + 08952aa1374d31c0ac104e8821f118d5245ebcd0
--- src/cmd/venti/srv/arena.c
+++ src/cmd/venti/srv/arena.c
@@ -31,7 +31,9 @@ initarenasum(void)
 {
 	needzeroscore();  /* OS X */
 
+	qlock(&sumlock);
 	sumwait.l = &sumlock;
+	qunlock(&sumlock);
 
 	if(vtproc(sumproc, nil) < 0){
 		seterr(EOk, "can't start arena checksum slave: %r");
@@ -477,9 +479,6 @@ void
 backsumarena(Arena *arena)
 {
 	ASum *as;
-
-	if(sumwait.l == nil)
-		return;
 
 	as = MK(ASum);
 	if(as == nil)
@@ -492,7 +491,12 @@ backsumarena(Arena *arena)
 	else
 		sumq = as;
 	sumqtail = as;
-	rwakeup(&sumwait);
+	/*
+	 * Might get here while initializing arenas,
+	 * before initarenasum has been called.
+	 */
+	if(sumwait.l)
+		rwakeup(&sumwait);
 	qunlock(&sumlock);
 }
 
@@ -513,7 +517,6 @@ sumproc(void *unused)
 		qunlock(&sumlock);
 		arena = as->arena;
 		free(as);
-
 		sumarena(arena);
 	}
 }