git: 9front

Download patch

ref: 4a6cba9ce95744b18c9371fb6495d60738cf0307
parent: 33a83ccba5119460cb8be05506575369646d0f6d
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Tue Mar 8 11:45:29 EST 2016

rio, libdraw: experimental removal of redundant flushimage() calls for roundtrip latency reduction

- remove redundant flushimage() calls before readmouse()
- remove flushimage() calls for allocimage(),freeimage() and originwindow()

this is experimental. it will break allocimage() error handling unless the
caller does explicit flushimage() calls, tho the gains
in usability over high latency connections is huge. in most cases, programs
will just terminate when encountering these errors.

--- a/sys/src/cmd/rio/rio.c
+++ b/sys/src/cmd/rio/rio.c
@@ -421,6 +421,7 @@
 			originwindow(i, i->r.min, view->r.max);
 		}
 		freeimage(i);
+		flushimage(display, 1);
 		free(s);
 	}
 }
@@ -850,9 +851,6 @@
 	r.max = p;
 	oi = nil;
 	while(mouse->buttons == 4){
-		readmouse(mousectl);
-		if(mouse->buttons != 4 && mouse->buttons != 0)
-			break;
 		if(!eqpt(mouse->xy, p)){
 			p = onscreen(mouse->xy);
 			r = canonrect(Rpt(p0, p));
@@ -864,9 +862,9 @@
 				oi = i;
 				border(i, r, Selborder, sizecol, ZP);
 				draw(i, insetrect(r, Selborder), cols[BACK], nil, ZP);
-				flushimage(display, 1);
 			}
 		}
+		readmouse(mousectl);
 	}
 	if(mouse->buttons != 0)
 		goto Rescue;
@@ -939,12 +937,10 @@
 	d = subpt(w->screenr.max, w->screenr.min);
 	op = subpt(mouse->xy, dm);
 	drawborder(Rect(op.x, op.y, op.x+d.x, op.y+d.y), 1);
-	flushimage(display, 1);
 	while(mouse->buttons==4){
 		p = subpt(mouse->xy, dm);
 		if(!eqpt(p, op)){
 			drawborder(Rect(p.x, p.y, p.x+d.x, p.y+d.y), 1);
-			flushimage(display, 1);
 			op = p;
 		}
 		readmouse(mousectl);
@@ -954,7 +950,6 @@
 	cornercursor(w, mouse->xy, 1);
 	moveto(mousectl, mouse->xy);	/* force cursor update; ugly */
 	menuing = FALSE;
-	flushimage(display, 1);
 	if(mouse->buttons!=0 || !goodrect(r)){
 		while(mouse->buttons)
 			readmouse(mousectl);
@@ -1050,7 +1045,6 @@
 		r = whichrect(w->screenr, p, which);
 		if(!eqrect(r, or) && goodrect(r)){
 			drawborder(r, 1);
-			flushimage(display, 1);
 			or = r;
 		}
 		readmouse(mousectl);
@@ -1057,7 +1051,6 @@
 	}
 	p = mouse->xy;
 	drawborder(or, 0);
-	flushimage(display, 1);
 	wsetcursor(w, 1);
 	if(mouse->buttons!=0 || !goodrect(or)){
 		while(mouse->buttons)
--- a/sys/src/cmd/rio/wind.c
+++ b/sys/src/cmd/rio/wind.c
@@ -174,7 +174,7 @@
 	Stringpair pair;
 	Wctlmesg wcm;
 	Completion *cr;
-	char *kbdq[8], *kbds;
+	char *kbdq[32], *kbds;
 	int kbdqr, kbdqw;
 
 	w = arg;
@@ -1032,7 +1032,6 @@
 	if(q0==q1 && selectq==w->q0){
 		wdoubleclick(w, &q0, &q1);
 		wsetselect(w, q0, q1);
-		flushimage(display, 1);
 		x = w->mc.xy.x;
 		y = w->mc.xy.y;
 		/* stay here until something interesting happens */
@@ -1072,7 +1071,6 @@
 	}else
 		clickwin = nil;
 	wsetselect(w, q0, q1);
-	flushimage(display, 1);
 	while(w->mc.buttons){
 		w->mc.msec = 0;
 		b = w->mc.buttons;
@@ -1089,7 +1087,6 @@
 			}
 		}
 		wscrdraw(w);
-		flushimage(display, 1);
 		while(w->mc.buttons == b)
 			readmouse(&w->mc);
 		clickwin = nil;
@@ -1414,6 +1411,7 @@
 		/* move it off-screen to hide it, in case client is slow in letting it go */
 		MOVEIT originwindow(i, i->r.min, view->r.max);
 		freeimage(i);
+		flushimage(display, 1);
 	}
 }
 
--- a/sys/src/libdraw/alloc.c
+++ b/sys/src/libdraw/alloc.c
@@ -47,8 +47,6 @@
 		return nil;
 	}
 
-	/* flush pending data so we don't get error allocating the image */
-	flushimage(d, 0);
 	a = bufimage(d, 1+4+4+1+4+1+4*4+4*4+4);
 	if(a == nil)
 		goto Error;
@@ -74,8 +72,6 @@
 	BPLONG(a+39, clipr.max.x);
 	BPLONG(a+43, clipr.max.y);
 	BPLONG(a+47, col);
-	if(flushimage(d, 0) < 0)
-		goto Error;
 
 	if(ai != nil)
 		i = ai;
@@ -207,7 +203,6 @@
 	if(i == nil || i->display == nil)
 		return 0;
 	d = i->display;
-	flushimage(d, 0);
 	if(i->screen != nil){
 		w = d->windows;
 		if(w == i)
@@ -226,9 +221,6 @@
 		return -1;
 	a[0] = 'f';
 	BPLONG(a+1, i->id);
-	if(flushimage(d, i->screen!=nil) < 0)
-		return -1;
-
 	return 0;
 }
 
--- a/sys/src/libdraw/window.c
+++ b/sys/src/libdraw/window.c
@@ -201,7 +201,6 @@
 	uchar *b;
 	Point delta;
 
-	flushimage(w->display, 0);
 	b = bufimage(w->display, 1+4+2*4+2*4);
 	if(b == nil)
 		return 0;
@@ -211,8 +210,6 @@
 	BPLONG(b+9, log.y);
 	BPLONG(b+13, scr.x);
 	BPLONG(b+17, scr.y);
-	if(flushimage(w->display, 1) < 0)
-		return -1;
 	delta = subpt(log, w->r.min);
 	w->r = rectaddpt(w->r, delta);
 	w->clipr = rectaddpt(w->clipr, delta);
--- a/sys/src/libframe/frselect.c
+++ b/sys/src/libframe/frselect.c
@@ -96,7 +96,6 @@
 		}
 		if(scrled)
 			(*f->scroll)(f, 0);
-		flushimage(f->display, 1);
 		if(!scrled)
 			readmouse(mc);
 		mp = mc->xy;
--