changelog shortlog tags branches files raw gz bz2 help

Mercurial > hg > plan9front / changeset: libdraw: avoid deadlock for mouse ioproc sending on resizec

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 }