diff options
| author | ftrvxmtrx <ftrvxmtrx@gmail.com> | 2013-04-28 00:23:20 +0200 |
|---|---|---|
| committer | ftrvxmtrx <ftrvxmtrx@gmail.com> | 2013-04-28 00:23:20 +0200 |
| commit | d5155e6bc8de47549af8396cc434df4b74c85bc1 (patch) | |
| tree | 813c6c505a7b9202b5be5cd4b41b7b8cca317b10 | |
| parent | d173927c4f381947126b18f029709d3b8abafb87 (diff) | |
| parent | 90036b9991198e709330c884b7497fff29e7a58d (diff) | |
| download | plan9front-d5155e6bc8de47549af8396cc434df4b74c85bc1.tar.xz | |
merge
| -rw-r--r-- | sys/src/libdraw/mouse.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/sys/src/libdraw/mouse.c b/sys/src/libdraw/mouse.c index 74147bf53..ceb93819d 100644 --- a/sys/src/libdraw/mouse.c +++ b/sys/src/libdraw/mouse.c @@ -39,24 +39,32 @@ 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 */ + 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 @@ 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 |
