From 6748d8362d7aa0fe0c1862ba1b6292effb8e286f Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 2 Jul 1992 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1992-07-02 --- port/devbit.c | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/port/devbit.c b/port/devbit.c index 861ec91ee493664d5e30bfadc1cdf4caddc1d5f2..ec4df26a80dc1a935f1a1777336a5b6f688de2e6 100644 --- a/port/devbit.c +++ b/port/devbit.c @@ -93,7 +93,7 @@ void bitcompact(void); int bitalloc(Rectangle, int); void bitfree(GBitmap*); void fontfree(GFont*); -void subfontfree(BSubfont*); +void subfontfree(BSubfont*, int); void arenafree(Arena*); void bitstring(GBitmap*, Point, GFont*, uchar*, long, Fcode); void bitloadchar(GFont*, int, GSubfont*, int); @@ -330,7 +330,7 @@ bitclose(Chan *c) for(sp=bit.subfont; spn+1) */ p[0] = 'J'; - if(bit.cacheid<0) + if(bit.cacheid < 0) error(Ebadfont); s = bit.subfont[bit.cacheid]; if(s==0 || s->ref==0) @@ -635,7 +635,7 @@ bitwrite(Chan *c, void *va, long n, ulong offset) Fcode fc; Fontchar *fcp; GBitmap *b, *src, *dst, *bp; - BSubfont *f, **fp; + BSubfont *f, *tf, **fp; GFont *ff, **ffp; if(c->qid.path == CHDIR) @@ -792,7 +792,7 @@ bitwrite(Chan *c, void *va, long n, ulong offset) v = BGSHORT(p+1); if(v<0 || v>=bit.nsubfont || (f=bit.subfont[v])==0 || f->ref==0) error(Ebadfont); - subfontfree(f); + subfontfree(f, v); m -= 3; p += 3; break; @@ -830,7 +830,7 @@ bitwrite(Chan *c, void *va, long n, ulong offset) * subfont cache check * * 'j' 1 - * qid 8 BUG: ignored + * qid 8 */ if(m < 9) error(Ebadblt); @@ -886,6 +886,14 @@ bitwrite(Chan *c, void *va, long n, ulong offset) f->ascent = p[4]; f->qid[0] = BGLONG(p+7); f->qid[1] = BGLONG(p+11); + /* check to see if already there, uncache if so */ + for(j=0; jqid[0]==f->qid[0] && tf->qid[1]==f->qid[1]) + f->qid[0] = ~0; /* uncached */ + } f->ref = 1; v = BGSHORT(p+5); if(v<0 || v>=bit.nmap || (dst=bit.map[v])==0) @@ -1401,10 +1409,9 @@ bitalloc(Rectangle rect, int ld) for(i=0; iref==0){ - bitfree(s->bits); - free(s->info); - free(s); - bit.subfont[i] = 0; + s->ref = 1; + s->qid[0] = ~0; /* force cleanup */ + subfontfree(s, i); } } bitcompact(); @@ -1479,10 +1486,17 @@ fontfree(GFont *f) } void -subfontfree(BSubfont *s) +subfontfree(BSubfont *s, int i) { - if(s != defont) /* don't free subfont 0, defont */ + if(s!=defont && s->ref>0){ /* don't free subfont 0, defont */ s->ref--; + if(s->ref==0 && s->qid[0]==~0){ /* uncached */ + bitfree(s->bits); + free(s->info); + free(s); + bit.subfont[i] = 0; + } + } return; }