itdevdraw: use global drawlk instead of per-client - plan9port - [fork] Plan 9 from user space Err mx1.adamsgaard.dk 70 hgit clone git://src.adamsgaard.dk/plan9port URL:git://src.adamsgaard.dk/plan9port mx1.adamsgaard.dk 70 1Log /src/plan9port/log.gph mx1.adamsgaard.dk 70 1Files /src/plan9port/files.gph mx1.adamsgaard.dk 70 1Refs /src/plan9port/refs.gph mx1.adamsgaard.dk 70 1README /src/plan9port/file/README.md.gph mx1.adamsgaard.dk 70 1LICENSE /src/plan9port/file/LICENSE.gph mx1.adamsgaard.dk 70 i--- Err mx1.adamsgaard.dk 70 1commit 587933c16132d880a06ff99bd087e64a3a04975e /src/plan9port/commit/587933c16132d880a06ff99bd087e64a3a04975e.gph mx1.adamsgaard.dk 70 1parent 94d381ec9d579e5336f3817b68cf4d1a8a7333db /src/plan9port/commit/94d381ec9d579e5336f3817b68cf4d1a8a7333db.gph mx1.adamsgaard.dk 70 hAuthor: Russ Cox URL:mailto:rsc@swtch.com mx1.adamsgaard.dk 70 iDate: Sat, 25 Jan 2020 14:33:20 -0500 Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 idevdraw: use global drawlk instead of per-client Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 iSetting up for a real window system. Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 iDiffstat: Err mx1.adamsgaard.dk 70 i M src/cmd/devdraw/devdraw.c | 26 ++++++++++++++------------ Err mx1.adamsgaard.dk 70 i M src/cmd/devdraw/devdraw.h | 5 +++-- Err mx1.adamsgaard.dk 70 i M src/cmd/devdraw/mac-screen.m | 7 +++---- Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i3 files changed, 20 insertions(+), 18 deletions(-) Err mx1.adamsgaard.dk 70 i--- Err mx1.adamsgaard.dk 70 1diff --git a/src/cmd/devdraw/devdraw.c b/src/cmd/devdraw/devdraw.c /src/plan9port/file/src/cmd/devdraw/devdraw.c.gph mx1.adamsgaard.dk 70 it@@ -14,6 +14,8 @@ Err mx1.adamsgaard.dk 70 i #include Err mx1.adamsgaard.dk 70 i #include "devdraw.h" Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i+QLock drawlk; Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i static int drawuninstall(Client*, int); Err mx1.adamsgaard.dk 70 i static Memimage* drawinstall(Client*, int, Memimage*, DScreen*); Err mx1.adamsgaard.dk 70 i static void drawfreedimage(Client*, DImage*); Err mx1.adamsgaard.dk 70 it@@ -47,14 +49,14 @@ gfx_replacescreenimage(Client *c, Memimage *m) Err mx1.adamsgaard.dk 70 i */ Err mx1.adamsgaard.dk 70 i Memimage *om; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i- qlock(&c->drawlk); Err mx1.adamsgaard.dk 70 i+ qlock(&drawlk); Err mx1.adamsgaard.dk 70 i om = c->screenimage; Err mx1.adamsgaard.dk 70 i c->screenimage = m; Err mx1.adamsgaard.dk 70 i m->screenref = 1; Err mx1.adamsgaard.dk 70 i if(om && --om->screenref == 0){ Err mx1.adamsgaard.dk 70 i _freememimage(om); Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i- qunlock(&c->drawlk); Err mx1.adamsgaard.dk 70 i+ qunlock(&drawlk); Err mx1.adamsgaard.dk 70 i gfx_mouseresized(c); Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 it@@ -142,9 +144,9 @@ addflush(Client *c, Rectangle r) Err mx1.adamsgaard.dk 70 i // and gfx thread might be blocked on drawlk trying to install a new screen Err mx1.adamsgaard.dk 70 i // during a resize. Err mx1.adamsgaard.dk 70 i rpc_gfxdrawunlock(); Err mx1.adamsgaard.dk 70 i- qunlock(&c->drawlk); Err mx1.adamsgaard.dk 70 i+ qunlock(&drawlk); Err mx1.adamsgaard.dk 70 i c->impl->rpc_flush(c, fr); Err mx1.adamsgaard.dk 70 i- qlock(&c->drawlk); Err mx1.adamsgaard.dk 70 i+ qlock(&drawlk); Err mx1.adamsgaard.dk 70 i rpc_gfxdrawlock(); Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 it@@ -187,9 +189,9 @@ drawflush(Client *c) Err mx1.adamsgaard.dk 70 i // and gfx thread might be blocked on drawlk trying to install a new screen Err mx1.adamsgaard.dk 70 i // during a resize. Err mx1.adamsgaard.dk 70 i rpc_gfxdrawunlock(); Err mx1.adamsgaard.dk 70 i- qunlock(&c->drawlk); Err mx1.adamsgaard.dk 70 i+ qunlock(&drawlk); Err mx1.adamsgaard.dk 70 i c->impl->rpc_flush(c, r); Err mx1.adamsgaard.dk 70 i- qlock(&c->drawlk); Err mx1.adamsgaard.dk 70 i+ qlock(&drawlk); Err mx1.adamsgaard.dk 70 i rpc_gfxdrawlock(); Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 it@@ -614,7 +616,7 @@ drawcoord(uchar *p, uchar *maxp, int oldx, int *newx) Err mx1.adamsgaard.dk 70 i int Err mx1.adamsgaard.dk 70 i draw_dataread(Client *cl, void *a, int n) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 i- qlock(&cl->drawlk); Err mx1.adamsgaard.dk 70 i+ qlock(&drawlk); Err mx1.adamsgaard.dk 70 i if(cl->readdata == nil){ Err mx1.adamsgaard.dk 70 i werrstr("no draw data"); Err mx1.adamsgaard.dk 70 i goto err; Err mx1.adamsgaard.dk 70 it@@ -627,11 +629,11 @@ draw_dataread(Client *cl, void *a, int n) Err mx1.adamsgaard.dk 70 i memmove(a, cl->readdata, cl->nreaddata); Err mx1.adamsgaard.dk 70 i free(cl->readdata); Err mx1.adamsgaard.dk 70 i cl->readdata = nil; Err mx1.adamsgaard.dk 70 i- qunlock(&cl->drawlk); Err mx1.adamsgaard.dk 70 i+ qunlock(&drawlk); Err mx1.adamsgaard.dk 70 i return n; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i err: Err mx1.adamsgaard.dk 70 i- qunlock(&cl->drawlk); Err mx1.adamsgaard.dk 70 i+ qunlock(&drawlk); Err mx1.adamsgaard.dk 70 i return -1; Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 it@@ -656,7 +658,7 @@ draw_datawrite(Client *client, void *v, int n) Err mx1.adamsgaard.dk 70 i Refreshfn reffn; Err mx1.adamsgaard.dk 70 i Refx *refx; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i- qlock(&client->drawlk); Err mx1.adamsgaard.dk 70 i+ qlock(&drawlk); Err mx1.adamsgaard.dk 70 i rpc_gfxdrawlock(); Err mx1.adamsgaard.dk 70 i a = v; Err mx1.adamsgaard.dk 70 i m = 0; Err mx1.adamsgaard.dk 70 it@@ -1431,7 +1433,7 @@ draw_datawrite(Client *client, void *v, int n) Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i rpc_gfxdrawunlock(); Err mx1.adamsgaard.dk 70 i- qunlock(&client->drawlk); Err mx1.adamsgaard.dk 70 i+ qunlock(&drawlk); Err mx1.adamsgaard.dk 70 i return oldn - n; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i Enodrawimage: Err mx1.adamsgaard.dk 70 it@@ -1502,6 +1504,6 @@ Ebadarg: Err mx1.adamsgaard.dk 70 i error: Err mx1.adamsgaard.dk 70 i werrstr("%s", err); Err mx1.adamsgaard.dk 70 i rpc_gfxdrawunlock(); Err mx1.adamsgaard.dk 70 i- qunlock(&client->drawlk); Err mx1.adamsgaard.dk 70 i+ qunlock(&drawlk); Err mx1.adamsgaard.dk 70 i return -1; Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 1diff --git a/src/cmd/devdraw/devdraw.h b/src/cmd/devdraw/devdraw.h /src/plan9port/file/src/cmd/devdraw/devdraw.h.gph mx1.adamsgaard.dk 70 it@@ -56,6 +56,8 @@ struct ClientImpl Err mx1.adamsgaard.dk 70 i void (*rpc_flush)(Client*, Rectangle); Err mx1.adamsgaard.dk 70 i }; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i+extern QLock drawlk; Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i struct Client Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 i int rfd; Err mx1.adamsgaard.dk 70 it@@ -69,10 +71,9 @@ struct Client Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i char* wsysid; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i- // drawlk protects the draw data structures. Err mx1.adamsgaard.dk 70 i+ // drawlk protects the draw data structures for all clients. Err mx1.adamsgaard.dk 70 i // It can be acquired by an RPC thread or a graphics thread Err mx1.adamsgaard.dk 70 i // but must not be held on one thread while waiting for the other. Err mx1.adamsgaard.dk 70 i- QLock drawlk; Err mx1.adamsgaard.dk 70 i /*Ref r;*/ Err mx1.adamsgaard.dk 70 i DImage* dimage[NHASH]; Err mx1.adamsgaard.dk 70 i CScreen* cscreen; Err mx1.adamsgaard.dk 70 1diff --git a/src/cmd/devdraw/mac-screen.m b/src/cmd/devdraw/mac-screen.m /src/plan9port/file/src/cmd/devdraw/mac-screen.m.gph mx1.adamsgaard.dk 70 it@@ -39,7 +39,6 @@ static uint msec(void); Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i static void rpc_resizeimg(Client*); Err mx1.adamsgaard.dk 70 i static void rpc_resizewindow(Client*, Rectangle); Err mx1.adamsgaard.dk 70 i-static void rpc_serve(Client*); Err mx1.adamsgaard.dk 70 i static void rpc_setcursor(Client*, Cursor*, Cursor2*); Err mx1.adamsgaard.dk 70 i static void rpc_setlabel(Client*, char*); Err mx1.adamsgaard.dk 70 i static void rpc_setmouse(Client*, Point); Err mx1.adamsgaard.dk 70 it@@ -496,17 +495,17 @@ rpc_flush(Client *client, Rectangle r) Err mx1.adamsgaard.dk 70 i if(!rectclip(&r, Rect(0, 0, self.dlayer.texture.width, self.dlayer.texture.height)) || !rectclip(&r, self.img->r)) Err mx1.adamsgaard.dk 70 i return; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i- // self.client->drawlk protects the pixel data in self.img. Err mx1.adamsgaard.dk 70 i+ // drawlk protects the pixel data in self.img. Err mx1.adamsgaard.dk 70 i // In addition to avoiding a technical data race, Err mx1.adamsgaard.dk 70 i // the lock avoids drawing partial updates, which makes Err mx1.adamsgaard.dk 70 i // animations like sweeping windows much less flickery. Err mx1.adamsgaard.dk 70 i- qlock(&self.client->drawlk); Err mx1.adamsgaard.dk 70 i+ qlock(&drawlk); Err mx1.adamsgaard.dk 70 i [self.dlayer.texture Err mx1.adamsgaard.dk 70 i replaceRegion:MTLRegionMake2D(r.min.x, r.min.y, Dx(r), Dy(r)) Err mx1.adamsgaard.dk 70 i mipmapLevel:0 Err mx1.adamsgaard.dk 70 i withBytes:byteaddr(self.img, Pt(r.min.x, r.min.y)) Err mx1.adamsgaard.dk 70 i bytesPerRow:self.img->width*sizeof(u32int)]; Err mx1.adamsgaard.dk 70 i- qunlock(&self.client->drawlk); Err mx1.adamsgaard.dk 70 i+ qunlock(&drawlk); Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i NSRect nr = NSMakeRect(r.min.x, r.min.y, Dx(r), Dy(r)); Err mx1.adamsgaard.dk 70 i dispatch_time_t time; Err mx1.adamsgaard.dk 70 .