git: 9front

Download patch

ref: a5c43c174741c2d9733b70f5b7195f919b8b261d
parent: 6ca9ff033b2cd9fcff7587e1bbd3c5ed3a5dcbb4
parent: 4d7dbb87837f83b6a20493839913f7cf3bb1c268
author: ftrvxmtrx <ftrvxmtrx@gmail.com>
date: Sat Apr 27 20:23:20 EDT 2013

merge

--- a/sys/src/libdraw/mouse.c
+++ b/sys/src/libdraw/mouse.c
@@ -39,7 +39,7 @@
 void
 _ioproc(void *arg)
 {
-	int n, one;
+	int n, nerr, one;
 	char buf[1+5*12];
 	Mouse m;
 	Mousectl *mc;
@@ -46,17 +46,25 @@
 
 	mc = arg;
 	threadsetname("mouseproc");
-	one = 1;
 	memset(&m, 0, sizeof m);
-loop:
+	nerr = 0;
 	while(mc->mfd >= 0){
 		n = read(mc->mfd, buf, sizeof buf);
-		if(n != 1+4*12)
-			goto loop;
+		if(n != 1+4*12){
+			yield();	/* if error is due to exiting, we'll exit here */
+			if(mc->mfd < 0)
+				break;
+			fprint(2, "mouse: bad count %d not 49: %r\n", n);
+			if(n<0 || ++nerr>10)
+				threadexits("read error");
+			continue;
+		}
+		nerr = 0;
 		switch(buf[0]){
 		case 'r':
+			one = 1;
 			if(send(mc->resizec, &one) < 0)
-				goto loop;
+				continue;
 			/* fall through */
 		case 'm':
 			m.xy.x = atoi(buf+1+0*12);
@@ -64,7 +72,7 @@
 			m.buttons = atoi(buf+1+2*12);
 			m.msec = atoi(buf+1+3*12);
 			if(send(mc->c, &m) < 0)
-				goto loop;
+				continue;
 			/*
 			 * mc->Mouse is updated after send so it doesn't have wrong value if we block during send.
 			 * This means that programs should receive into mc->Mouse (see readmouse() above) if
--