summaryrefslogtreecommitdiff
path: root/sys/src/9/port/devdraw.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@rei2>2012-02-20 10:49:14 +0100
committercinap_lenrek <cinap_lenrek@rei2>2012-02-20 10:49:14 +0100
commit5b07f6238bcc14a044d7fa4373eda9ce68d05d64 (patch)
tree4ed265cdaed8572b8a6e4760d4dbbb10a822f26e /sys/src/9/port/devdraw.c
parente992808e49beb230edd9ae892244aac86ec34351 (diff)
devdraw: use QLock to serialize sleep on refresh to prevent double sleep
Diffstat (limited to 'sys/src/9/port/devdraw.c')
-rw-r--r--sys/src/9/port/devdraw.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/sys/src/9/port/devdraw.c b/sys/src/9/port/devdraw.c
index 017942194..f690c7229 100644
--- a/sys/src/9/port/devdraw.c
+++ b/sys/src/9/port/devdraw.c
@@ -73,6 +73,7 @@ struct Client
CScreen* cscreen;
Refresh* refresh;
Rendez refrend;
+ QLock refq;
uchar* readdata;
int nreaddata;
int busy;
@@ -1227,11 +1228,18 @@ drawread(Chan *c, void *a, long n, vlong off)
break;
dunlock();
if(waserror()){
- dlock(); /* restore lock for waserror() above */
+ dlock();
+ nexterror();
+ }
+ eqlock(&cl->refq);
+ if(waserror()){
+ qunlock(&cl->refq);
nexterror();
}
sleep(&cl->refrend, drawrefactive, cl);
poperror();
+ qunlock(&cl->refq);
+ poperror();
dlock();
}
p = a;