diff options
author | qwx <qwx@sciops.net> | 2022-08-18 05:33:31 +0000 |
---|---|---|
committer | qwx <qwx@sciops.net> | 2022-08-18 05:33:31 +0000 |
commit | e7d03d19100fe3180906c8ce3f2cab3ba9387fe8 (patch) | |
tree | eca8dc5f945c65ba01370a1783c927c3c0670dcb /sys/src/9/zynq | |
parent | 218d21f3b5743ddaddb7252b7088946a62b49244 (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.c | 16 |
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(); |