diff options
author | cinap_lenrek <cinap_lenrek@rei2> | 2012-02-20 10:49:14 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@rei2> | 2012-02-20 10:49:14 +0100 |
commit | 5b07f6238bcc14a044d7fa4373eda9ce68d05d64 (patch) | |
tree | 4ed265cdaed8572b8a6e4760d4dbbb10a822f26e /sys/src/9/port/devdraw.c | |
parent | e992808e49beb230edd9ae892244aac86ec34351 (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.c | 10 |
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; |