ref: 54f615f6c0090c7c0011f4121ecf54fcf1e07a6b
parent: 29c1eaaf69513e62627678aba7ab68c7a5586ef1
author: Jacob Moody <moody@posixcafe.org>
date: Fri Jun 24 22:42:19 EDT 2022
tidy drawlock use We need to be careful about doing lock transitions, it's easier to just maintain the lock and call functions with the locks held.
--- a/kern/devdraw.c
+++ b/kern/devdraw.c
@@ -940,7 +940,7 @@
return di;
}
-static int
+int
initscreenimage(void)
{
if(screenimage != nil)
@@ -956,9 +956,8 @@
}
void
-deletescreenimage(void)
+_deletescreenimage(void)
{
- dlock();
if(screenimage){
/* will be freed via screendimage; disable */
screenimage->clipr = ZR;
@@ -968,6 +967,13 @@
drawfreedimage(screendimage);
screendimage = nil;
}
+}
+
+void
+deletescreenimage(void)
+{
+ dlock();
+ _deletescreenimage();
dunlock();
}
@@ -996,8 +1002,6 @@
static Walkqid*
drawwalk(Chan *c, Chan *nc, char **name, int nname)
{
- if(screenimage == nil)
- error("no frame buffer");
return devwalk(c, nc, name, nname, 0, 0, drawgen);
}
--- a/kern/term.c
+++ b/kern/term.c
@@ -9,6 +9,8 @@
#include "screen.h"
extern Memimage *gscreen;
+int initscreenimage(void);
+void _deletescreenimage(void);
static Memsubfont *memdefont;
static Lock screenlock;
@@ -112,22 +114,27 @@
continue;
}
gscreen->clipr = resize.r;
+ _deletescreenimage();
+ initscreenimage();
qunlock(&drawlock);
screenwin();
- deletescreenimage();
- resetscreenimage();
- osmsleep(1000);
}
}
void
-screenresize(Rectangle r)
+_screenresize(Rectangle r)
{
- qlock(&drawlock);
resize.r = r;
resize.f = 1;
wakeup(&resize.z);
+}
+
+void
+screenresize(Rectangle r)
+{
+ qlock(&drawlock);
+ _screenresize(r);
qunlock(&drawlock);
}