Commit Diff


commit - 6a5c5d48705ef8374f5172731408f0f27b0f0dc6
commit + f99790979b4a659d7f6e490fbb8b26d630804eed
blob - a12abd81c03b148893ee84b0749eb31a916e5c39
blob + bdb33086df16cf9561ba6030797a47ca16d31371
--- src/cmd/draw/mkfile
+++ src/cmd/draw/mkfile
@@ -5,10 +5,14 @@ SHORTLIB=draw bio 9
 
 <$PLAN9/src/mkmany
 
+$O.tcolors: tcolors.$O
+	$LD -o $target tcolors.$O -ldraw -lthread -l9 $LDFLAGS
+
 $O.mc: mc.$O
-	$LD -o $target mc.$O -lfs -lmux -lthread -ldraw -lbio -l9 $LDFLAGS
+	$LD -o $target mc.$O -lfs -lmux -ldraw -lthread -lbio -l9 $LDFLAGS
 
 $O.stats: stats.$O
-	$LD -o $target stats.$O -lthread -ldraw -lbio -l9 $LDFLAGS
+	$LD -o $target stats.$O -ldraw -lthread -lbio -l9 $LDFLAGS
 
 LDFLAGS=$LDFLAGS -L$X11/lib -lX11
+
blob - 2f6064673e660a63bf037362e502963ab3c43433
blob + 87326cdac878459c84d96c9c326f99c3b77ec8a6
--- src/cmd/draw/stats.c
+++ src/cmd/draw/stats.c
@@ -666,14 +666,15 @@ keyboardthread(void *v)
 			killall("quit");
 }
 
-void machthread(void*);
+void machproc(void*);
+void updateproc(void*);
 
 void
 threadmain(int argc, char *argv[])
 {
 	int i, j;
 	char *s;
-	ulong v, vmax, nargs;
+	ulong nargs;
 	char args[100];
 
 	nmach = 1;
@@ -733,7 +734,7 @@ threadmain(int argc, char *argv[])
 	}
 
 	for(i=0; i<nmach; i++)
-		threadcreate(machthread, &mach[i], STACK);
+		proccreate(machproc, &mach[i], STACK);
 
 	for(i=0; i<nargs; i++)
 	switch(args[i]){
@@ -804,10 +805,18 @@ threadmain(int argc, char *argv[])
 	threadcreate(keyboardthread, nil, XSTACK);
 	threadcreate(mousethread, nil, XSTACK);
 	threadcreate(resizethread, nil, XSTACK);
-
+	proccreate(updateproc, nil, XSTACK);
 	resize();
 	unlockdisplay(display);
+}
 
+void
+updateproc(void *z)
+{
+	int i;
+	ulong v, vmax;
+
+	USED(z);
 	for(;;){
 		parity = 1-parity;
 		lockdisplay(display);
@@ -821,12 +830,12 @@ threadmain(int argc, char *argv[])
 		}
 		flushimage(display, 1);
 		unlockdisplay(display);
-		threadsleep(sleeptime);
+		sleep(sleeptime);
 	}
 }
 
 void
-machthread(void *v)
+machproc(void *v)
 {
 	char buf[256], *f[4], *p;
 	int i, n, t;
@@ -835,7 +844,7 @@ machthread(void *v)
 	m = v;
 	t = 0;
 	for(;;){
-		n = threadread(m->fd, buf+t, sizeof buf-t);
+		n = read(m->fd, buf+t, sizeof buf-t);
 		m->dead = 0;
 		if(n <= 0)
 			break;
blob - 0ffd50534502f236a3e26a9b6b8c410121114b9c
blob + e9be1eb65f8a140838151190729a2ea944c3dc98
--- src/cmd/plumb/fsys.c
+++ src/cmd/plumb/fsys.c
@@ -199,7 +199,7 @@ startfsys(void)
 	if(post9pservice(p[1], "plumb") < 0)
 		sysfatal("post9pservice plumb: %r");
 	close(p[1]);
-	threadcreate(fsysproc, nil, Stack);
+	proccreate(fsysproc, nil, Stack);
 }
 
 static void
@@ -218,14 +218,19 @@ fsysproc(void *v)
 		if(buf == nil)
 			error("malloc failed: %r");
 		qlock(&readlock);
-		n = threadread9pmsg(srvfd, buf, messagesize);
+		n = read9pmsg(srvfd, buf, messagesize);
 		if(n <= 0){
 			if(n < 0)
 				error("i/o error on server channel");
 			threadexitsall("unmounted");
 		}
-		if(readlock.head == nil)	/* no other processes waiting to read; start one */
-			threadcreate(fsysproc, nil, Stack);
+		/*
+		 * can give false positive (create an extra fsysproc) once in a while,
+		 * but no false negatives, so good enough.  once we have one extra
+		 * we'll never have more.
+		 */
+		if(readlock.waiting.head == nil)	/* no other processes waiting to read; start one */
+			proccreate(fsysproc, nil, Stack);
 		qunlock(&readlock);
 		if(t == nil)
 			t = emalloc(sizeof(Fcall));