From af286704d3ddfd156561a53b26cce98195bae798 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Mon, 6 Mar 2000 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2000-03-06 --- port/devdraw.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/port/devdraw.c b/port/devdraw.c index 8718d73d556d41eaeea201df3059af5604deb0f7..964e5a124b70187c16b35a7082c6ce17b99ff187 100644 --- a/port/devdraw.c +++ b/port/devdraw.c @@ -117,8 +117,7 @@ struct FChar * Reference counts in DImages: * one per open by original client * one per screen image or fill - * Images published by name are not ref'ed, but protected by - * comparing version number with the DName entry. + * one per image derived from this one by name */ struct DImage { @@ -131,6 +130,7 @@ struct DImage int nfchar; FChar* fchar; DScreen* dscreen; /* 0 if not a window */ + DImage* fromname; /* image this one is derived from, by name */ DImage* next; }; @@ -496,10 +496,10 @@ drawinstall(Client *client, int id, Memimage *i, DScreen *dscreen) d->image = i; d->nfchar = 0; d->fchar = 0; + d->fromname = 0; d->dscreen = dscreen; d->next = client->dimage[id&HASHMASK]; client->dimage[id&HASHMASK] = d; -// print("install %d %p...", id, d); return i; } @@ -616,8 +616,10 @@ drawfreedimage(DImage *dimage) drawdelname(sdraw.name+i); else i++; - if(dimage->vers != 0) /* acquired by name; owned by someone else*/ + if(dimage->fromname){ /* acquired by name; owned by someone else*/ + drawfreedimage(dimage->fromname); goto Return; + } if(dimage->image == screenimage) /* don't free the display */ goto Return; ds = dimage->dscreen; @@ -1594,6 +1596,8 @@ drawmesg(Client *client, void *av, int n) error("draw: can't happen"); di->vers = dn->vers; di->name = smalloc(j+1); + di->fromname = dn->dimage; + di->fromname->ref++; memmove(di->name, a+6, j); di->name[j] = 0; client->infoid = dstid;