changeset 6891: | 9ae9d496c4aa |
---|---|
parent 6890: | f47a9f61f3ed |
child 6892: | 5af85d7f176a |
author: | cinap_lenrek@felloff.net |
date: | Sun, 18 Nov 2018 03:37:04 +0100 |
files: | sys/src/libdraw/mouse.c |
description: | libdraw: avoid deadlock for mouse ioproc sending on resizec a deadlock has been observed with samterm (thanks burnzez), that shows the mouse ioproc being stuck in sending on the resize channel, while the mouse consumer is stuck in a readmouse() loop wanting a rectangle to be drawn by the user: recv(v=0x42df50)+0x28 /sys/src/libthread/channel.c:321 readmouse(mc=0x42df50)+0x54 /sys/src/libdraw/mouse.c:34 getrect(.ret=0x41bce0,but=0x4,mc=0x42df50)+0x62 /sys/src/libdraw/getrect.c:49 r=0x41bc70 rc=0x41bc70 getr(rp=0x41bce0)+0x24 /sys/src/cmd/samterm/main.c:244 p=0x6b000004f6 r=0x2 sweeptext(new=0x0,tag=0x2d)+0x12 /sys/src/cmd/samterm/menu.c:208 r=0x2 t=0x42df50 inmesg(type=0x2,count=0x2)+0x1ab /sys/src/cmd/samterm/mesg.c:136 m=0x10000002d l=0x2d00001b00 i=0x43829000000001 t=0x438290 lp=0x42e050 rcv()+0x7a /sys/src/cmd/samterm/mesg.c:77 threadmain(argv=0x7ffffeffef90)+0x173 /sys/src/cmd/samterm/main.c:63 so avoid blocking in the mouse ioproc by using nbsend() instead of send() for writing to the resize channel. |
1.1--- a/sys/src/libdraw/mouse.c 1.2+++ b/sys/src/libdraw/mouse.c 1.3@@ -66,7 +66,7 @@ void 1.4 switch(buf[0]){ 1.5 case 'r': 1.6 one = 1; 1.7- if(send(mc->resizec, &one) < 0) 1.8+ if(nbsend(mc->resizec, &one) < 0) 1.9 continue; 1.10 /* fall through */ 1.11 case 'm': 1.12@@ -122,7 +122,7 @@ initmouse(char *file, Image *i) 1.13 free(t); 1.14 mc->image = i; 1.15 mc->c = chancreate(sizeof(Mouse), 0); 1.16- mc->resizec = chancreate(sizeof(int), 2); 1.17+ mc->resizec = chancreate(sizeof(int), 1); 1.18 mc->pid = proccreate(_ioproc, mc, 4096); 1.19 return mc; 1.20 }