summaryrefslogtreecommitdiff
path: root/sys/src/9/zynq
diff options
context:
space:
mode:
authorqwx <qwx@sciops.net>2022-08-18 05:33:31 +0000
committerqwx <qwx@sciops.net>2022-08-18 05:33:31 +0000
commite7d03d19100fe3180906c8ce3f2cab3ba9387fe8 (patch)
treeeca8dc5f945c65ba01370a1783c927c3c0670dcb /sys/src/9/zynq
parent218d21f3b5743ddaddb7252b7088946a62b49244 (diff)
devvga: fix race condition between writes to vgactl
to reproduce: for(i in `{seq 10}) echo softscreen off >/dev/vgactl
Diffstat (limited to 'sys/src/9/zynq')
-rw-r--r--sys/src/9/zynq/screen.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/sys/src/9/zynq/screen.c b/sys/src/9/zynq/screen.c
index ec91a820b..16dcfa69c 100644
--- a/sys/src/9/zynq/screen.c
+++ b/sys/src/9/zynq/screen.c
@@ -299,8 +299,8 @@ fbctlwrite(Chan*, void *a, long n, vlong)
if(chantodepth(chan) != z)
error("depth, channel do not match");
- deletescreenimage();
eqlock(&drawlock);
+ deletescreenimage();
if(memimageinit() < 0){
qunlock(&drawlock);
error("memimageinit failed");
@@ -310,14 +310,18 @@ fbctlwrite(Chan*, void *a, long n, vlong)
gscreen = nil;
}
gscreen = allocmemimage(Rect(0,0,x,y), chan);
- qunlock(&drawlock);
- /* wet floor */
-
- case CMinit:
- if(gscreen == nil)
+ Init:
+ if(gscreen == nil){
+ qunlock(&drawlock);
error("no framebuffer");
+ }
resetscreenimage();
+ qunlock(&drawlock);
break;
+
+ case CMinit:
+ qlock(&drawlock);
+ goto Init;
}
free(cb);
poperror();