From a72a7c1cc2ba721fe0871cd69951ae8ac526487e Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Sat, 27 Apr 2013 04:10:39 +0200 Subject: libdraw: exit mouseproc() on read error instead of spinning --- sys/src/libdraw/mouse.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/sys/src/libdraw/mouse.c b/sys/src/libdraw/mouse.c index 74147bf53..49c5f278e 100644 --- a/sys/src/libdraw/mouse.c +++ b/sys/src/libdraw/mouse.c @@ -39,24 +39,30 @@ static void _ioproc(void *arg) { - int n, one; + int n, nerr, one; char buf[1+5*12]; Mouse m; Mousectl *mc; 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 */ + 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 +70,7 @@ loop: 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 -- cgit v1.2.3 From 90036b9991198e709330c884b7497fff29e7a58d Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Sat, 27 Apr 2013 04:21:08 +0200 Subject: libdraw: avoid printing error on closemouse() --- sys/src/libdraw/mouse.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sys/src/libdraw/mouse.c b/sys/src/libdraw/mouse.c index 49c5f278e..ceb93819d 100644 --- a/sys/src/libdraw/mouse.c +++ b/sys/src/libdraw/mouse.c @@ -52,6 +52,8 @@ _ioproc(void *arg) n = read(mc->mfd, buf, sizeof buf); 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"); -- cgit v1.2.3