git: 9front

Download patch

ref: e2161c3c4260b8f83e80cb4b6b9fbe139666f66b
parent: 2e4a67560854ff7224ad48bf6b8f41e9e26cf147
author: rodri <rgl@antares-labs.eu>
date: Fri Jan 2 09:22:13 EST 2026

/sys/src/cmd: display locking cleanup

remove unnecessary display locking procedures and the ubiquitous
display->locking = 1; statement, which is now ignored in libdraw.

--- a/sys/src/cmd/audio/zuke/zuke.c
+++ b/sys/src/cmd/audio/zuke/zuke.c
@@ -312,8 +312,6 @@
 	w += stringwidth(f, tmp+i);
 	snprint(tmp+i, sizeof(tmp)-i, "%d%%", volume);
 
-	lockdisplay(display);
-
 	if(back == nil || Dx(screen->r) != Dx(back->r) || Dy(screen->r) != Dy(back->r)){
 		freeimage(back);
 		back = allocimage(display, Rpt(ZP,subpt(screen->r.max, screen->r.min)), XRGB32, 0, DNofill);
@@ -455,7 +453,6 @@
 	opcur = pcur;
 
 	flushimage(display, 1);
-	unlockdisplay(display);
 }
 
 static void
@@ -1359,8 +1356,6 @@
 
 	if(initdraw(nil, nil, "zuke") < 0)
 		sysfatal("initdraw: %r");
-	unlockdisplay(display);
-	display->locking = 1;
 	f = display->defaultfont;
 	Scrollwidth = MAX(14, stringwidth(f, "#"));
 	Scrollheight = MAX(16, f->height);
--- a/sys/src/cmd/camv.c
+++ b/sys/src/cmd/camv.c
@@ -202,11 +202,11 @@
 		p = divpt(addpt(screen->r.min, screen->r.max), 2);
 		q = divpt(subpt(i->r.max, i->r.min), 2);
 		r = (Rectangle){subpt(p, q), addpt(p, q)};
-		lockdisplay(display);
+		rlockdisplay(display);
 		draw(disp, r, i, nil, i->r.min);
 		freeimage(i);
 		flushimage(display, 1);
-		unlockdisplay(display);
+		runlockdisplay(display);
 	}
 	fprint(2, "readimage: %r\n");
 	close(fd);
@@ -234,18 +234,17 @@
 	if(mc == nil) sysfatal("initmouse: %r");
 	threadcreate(resizethread, nil, mainstacksize);
 	proccreate(videoproc, nil, mainstacksize);
-	display->locking = 1;
 	flushimage(display, 1);
 	unlockdisplay(display);
 	while(recv(mc->c, &mc->Mouse) >= 0){
 		if(mc->buttons == 0)
 			continue;
-		lockdisplay(display);
+		rlockdisplay(display);
 		if((mc->buttons & 4) != 0)
 			rmb();
 		else if((mc->buttons & 2) != 0)
 			mmb();
 		flushimage(display, 1);
-		unlockdisplay(display);
+		runlockdisplay(display);
 	}
 }
--- a/sys/src/cmd/faces/main.c
+++ b/sys/src/cmd/faces/main.c
@@ -711,7 +711,6 @@
 		addmaildir(maildir);
 	init();
 	unlockdisplay(display);	/* initdraw leaves it locked */
-	display->locking = 1;	/* tell library we're using the display lock */
 	setdate();
 	eresized(0);
 
--- a/sys/src/cmd/fontsel.c
+++ b/sys/src/cmd/fontsel.c
@@ -71,7 +71,6 @@
 	int i, w, maxw;
 	char t[256];
 
-	lockdisplay(display);
 	draw(screen, screen->r, display->white, nil, ZP);
 	p = screen->r.min;
 
@@ -105,7 +104,6 @@
 	string(screen, p, display->black, ZP, font, t);
 
 	flushimage(display, 1);
-	unlockdisplay(display);
 }
 
 static int
@@ -203,7 +201,6 @@
 {
 	char t[512];
 
-	lockdisplay(display);
 	if(f != nil)
 		freefont(f);
 	if(cdir->isttf)
@@ -212,7 +209,6 @@
 		snprint(t, sizeof(t), "%s/%s/%s.font", cdir->prefix, cdir->name, cdir->fonts[cdir->ifont]);
 	if((f = openfont(display, t)) == nil)
 		snprint(lasterr, sizeof(lasterr), "%r");
-	unlockdisplay(display);
 }
 
 static char *
@@ -294,8 +290,6 @@
 		sysfatal("initmouse: %r");
 	a[Cmouse].c = mctl->c;
 	a[Cresize].c = mctl->resizec;
-	display->locking = 1;
-	unlockdisplay(display);
 
 	memset(&menu, 0, sizeof(menu));
 	cdir = &dirs[0];
--- a/sys/src/cmd/ip/gping.c
+++ b/sys/src/cmd/ip/gping.c
@@ -5,6 +5,7 @@
 #include <fcall.h>
 #include <draw.h>
 #include <event.h>
+#include <keyboard.h>
 #include <ip.h>
 #include "icmp.h"
 
@@ -828,13 +829,11 @@
 void
 eresized(int new)
 {
-	lockdisplay(display);
 	if(new && getwindow(display, Refnone) < 0) {
 		fprint(2, "%s: can't reattach to window\n", argv0);
 		killall("reattach");
 	}
 	resize();
-	unlockdisplay(display);
 }
 
 void
@@ -906,25 +905,6 @@
 }
 
 void
-mouseproc(void*)
-{
-	Mouse mouse;
-
-	for(;;){
-		mouse = emouse();
-		if(mouse.buttons == 4){
-			lockdisplay(display);
-			dobutton2(&mouse);
-			unlockdisplay(display);
-		} else if(mouse.buttons == 1){
-			lockdisplay(display);
-			dobutton1(&mouse);
-			unlockdisplay(display);
-		}
-	}
-}
-
-void
 startproc(void (*f)(void*), void *arg)
 {
 	int pid;
@@ -944,7 +924,8 @@
 void
 main(int argc, char *argv[])
 {
-	int i, j;
+	Event e;
+	int i, j, Etimer;
 	long v, vmax, mark;
 	char flags[10], *f, *p;
 
@@ -996,30 +977,38 @@
 		fprint(2, "%s: initdraw failed: %r\n", argv0);
 		exits("initdraw");
 	}
-	display->locking = 1;	/* tell library we're using the display lock */
 	colinit();
-	einit(Emouse);
-	startproc(mouseproc, 0);
-
+	einit(Emouse|Ekeyboard);
+	Etimer = etimer(0, pinginterval/nmach);
 	resize();
 
 	starttime = time(0);
+	j = 0;
 
-	unlockdisplay(display); /* display is still locked from initdraw() */
-	for(j = 0; ; j++){
-		lockdisplay(display);
-		if(j == nmach){
-			parity = 1-parity;
-			j = 0;
-			for(i=0; i<nmach*ngraph; i++){
-				graph[i].newvalue(graph[i].mach, &v, &vmax, &mark);
-				graph[i].update(&graph[i], v, vmax, mark);
+	for(;;)
+		switch(eread(Emouse|Ekeyboard|Etimer, &e)){
+		case Emouse:
+			if(e.mouse.buttons == 4)
+				dobutton2(&e.mouse);
+			else if(e.mouse.buttons == 1)
+				dobutton1(&e.mouse);
+			break;
+		case Ekeyboard:
+			if(e.kbdc==Kdel || e.kbdc=='q')
+				killall(nil);
+			break;
+		default: /* Etimer */
+			if(j == nmach){
+				parity = 1-parity;
+				j = 0;
+				for(i=0; i<nmach*ngraph; i++){
+					graph[i].newvalue(graph[i].mach, &v, &vmax, &mark);
+					graph[i].update(&graph[i], v, vmax, mark);
+				}
+				starttime = time(0);
 			}
-			starttime = time(0);
+			flushimage(display, 1);
+			pingsend(&mach[j%nmach]);
+			j++;
 		}
-		flushimage(display, 1);
-		unlockdisplay(display);
-		pingsend(&mach[j%nmach]);
-		sleep(pinginterval/nmach);
-	}
 }
--- a/sys/src/cmd/mothra/mothra.c
+++ b/sys/src/cmd/mothra/mothra.c
@@ -279,17 +279,6 @@
 		esetcursor(0);
 }
 
-void drawlock(int dolock){
-	static int ref = 0;
-	if(dolock){
-		if(ref++ == 0)
-			lockdisplay(display);
-	} else {
-		if(--ref == 0)
-			unlockdisplay(display);
-	}
-}
-
 void scrollto(char *tag);
 void search(void);
 
@@ -341,7 +330,6 @@
 	}
 	if(initdraw(0, 0, mothra) < 0)
 		sysfatal("initdraw: %r");
-	display->locking = 1;
 	chrwidth=stringwidth(font, "0");
 	pltabsize(chrwidth, 8*chrwidth);
 	einit(Emouse|Ekeyboard);
@@ -362,9 +350,7 @@
 	bullet=allocimage(display, Rect(0,0,25, 8), screen->chan, 0, DWhite);
 	fillellipse(bullet, Pt(4,4), 3, 3, display->black, ZP);
 	mkpanels();
-	unlockdisplay(display);
 	eresized(0);
-	drawlock(1);
 
 	if(url && url[0])
 		geturl(url, -1, 1, 0);
@@ -384,9 +370,7 @@
 			}
 		}
 
-		drawlock(0);
 		i=event(&e);
-		drawlock(1);
 
 		switch(i){
 		case Ekick:
@@ -500,7 +484,6 @@
 void eresized(int new){
 	Rectangle r;
 
-	drawlock(1);
 	if(new && getwindow(display, Refnone) == -1) {
 		fprint(2, "getwindow: %r\n");
 		exits("getwindow");
@@ -511,7 +494,6 @@
 	pldraw(cmd, screen);	/* put cmd box on screen for alt display */
 	pldraw(root, screen);
 	flushimage(display, 1);
-	drawlock(0);
 }
 void *emalloc(int n){
 	void *v;
@@ -1054,11 +1036,8 @@
 			w = www(i = wwwtop++);
 			if(i >= NWWW){
 				/* wait for the reader to finish the document */
-				while(!w->finished && !w->alldone){
-					drawlock(0);
+				while(!w->finished && !w->alldone)
 					sleep(10);
-					drawlock(1);
-				}
 				freetext(w->text);
 				freeform(w->form);
 				freepix(w->pix);
--- a/sys/src/cmd/page.c
+++ b/sys/src/cmd/page.c
@@ -907,11 +907,8 @@
 		}
 		if(p->image == nil)
 			p->open = nil;
-		else {
-			lockdisplay(display);
+		else
 			imemsize += imagesize(p->image);
-			unlockdisplay(display);
-		}
 	}
 }
 
@@ -924,10 +921,8 @@
 
 	if(p->open == nil || p->image == nil)
 		return;
-	lockdisplay(display);
 	imemsize -= imagesize(p->image);
 	freeimage(p->image);
-	unlockdisplay(display);
 	p->image = nil;
 }
 
@@ -967,9 +962,7 @@
 				newwin = 0;
 				resizewin(size);
 			}
-			lockdisplay(display);
 			drawpage(p);
-			unlockdisplay(display);
 		}
 		qunlock(p);
 	next:
@@ -1323,29 +1316,13 @@
 	nproc++;
 }
 
-/* recursive display lock, called from main proc only */
 void
-drawlock(int dolock){
-	static int ref = 0;
-	if(dolock){
-		if(ref++ == 0)
-			lockdisplay(display);
-	} else {
-		if(--ref == 0)
-			unlockdisplay(display);
-	}
-}
-
-
-void
 showpage(Page *p)
 {
 	if(p == nil)
 		return;
-	drawlock(0);
 	unloadpages(imemlimit);
 	showpage1(p);
-	drawlock(1);
 }
 
 void
@@ -1356,7 +1333,6 @@
 
 	if(p == nil)
 		return;
-	drawlock(0);
 	qlock(p);
 	if((fd = openpage(p)) < 0)
 		goto Out;
@@ -1372,7 +1348,6 @@
 	close(fd);
 Out:
 	qunlock(p);
-	drawlock(1);
 }
 
 void
@@ -1388,7 +1363,6 @@
 	ps = Pt(0, 0);
 	if(p->image != nil)
 		ps = addpt(subpt(p->image->r.max, p->image->r.min), Pt(24, 24));
-	drawlock(0);
 	if((fd = p->fd) < 0){
 		if(p->open != popenfile)
 			return;
@@ -1415,7 +1389,6 @@
 		exits(0);
 	}
 	close(fd);
-	drawlock(1);
 }
 
 void
@@ -1423,7 +1396,6 @@
 {
 	Page *p;
 
-	drawlock(1);
 	if(new && getwindow(display, Refnone) == -1)
 		sysfatal("getwindow: %r");
 	if((p = current) != nil){
@@ -1432,7 +1404,6 @@
 			qunlock(p);
 		}
 	}
-	drawlock(0);
 }
 
 int cohort = -1;
@@ -1472,10 +1443,8 @@
 		rotate = 0;
 	Unload:
 		viewgen++;
-		drawlock(0);
 		unloadpages(0);
 		showpage1(current);
-		drawlock(1);
 		break;
 	case Cupsidedown:
 		rotate += 90;
@@ -1676,8 +1645,6 @@
 	paper = display->white;
 	frame = display->black;
 	ground = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0x777777FF);
-	display->locking = 1;
-	unlockdisplay(display);
 
 	einit(Ekeyboard|Emouse);
 	eplumb(Eplumb, "image");
@@ -1696,11 +1663,8 @@
 	for(i=0; i<NPROC/4; i++)	/* rice */
 		showpage1(current);
 
-	drawlock(1);
 	for(;;){
-		drawlock(0);
 		i=event(&e);
-		drawlock(1);
 
 		switch(i){
 		case Emouse:
@@ -1804,9 +1768,7 @@
 				j = trywalk(s, plumblookup(pm->attr, "addr"));
 				if(j == nil){
 					current = root;
-					drawlock(0);
 					j = addpage(root, s, popenfile, s, fd);
-					drawlock(1);
 				}
 				forward = 0;
 				showpage(j);
--- a/sys/src/cmd/paint.c
+++ b/sys/src/cmd/paint.c
@@ -777,10 +777,8 @@
 					free(filename);
 					filename = strdup(s);
 				Readimage:
-					unlockdisplay(display);
-					img = readimage(display, fd, 1);
+					img = readimage(display, fd, 0);
 					close(fd);
-					lockdisplay(display);
 					if(img == nil){
 						werrstr("readimage: %r");
 						goto Error;
--- a/sys/src/cmd/vnc/vncv.c
+++ b/sys/src/cmd/vnc/vncv.c
@@ -146,7 +146,6 @@
 	if(initdraw(0, 0, label) < 0)
 		sysfatal("initdraw: %r");
 	free(label);
-	display->locking = 1;
 	unlockdisplay(display);
 
 	choosecolor(vnc);
--