diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-04-27 04:10:39 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-04-27 04:10:39 +0200 |
commit | a72a7c1cc2ba721fe0871cd69951ae8ac526487e (patch) | |
tree | 00359a21ddd3251158048034aca7c910aef3c0d2 /sys/src/libdraw/mouse.c | |
parent | 3f8c1dc2faf6fdc3743eabaa75eb0587e7660499 (diff) |
libdraw: exit mouseproc() on read error instead of spinning
Diffstat (limited to 'sys/src/libdraw/mouse.c')
-rw-r--r-- | sys/src/libdraw/mouse.c | 20 |
1 files 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 |