plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

commit 24c4c46b98e19733700cdb0bccf1c56577f0f56a
parent 4b65e43c54c2ca1394babed18cc02f4fffc22e16
Author: rsc <devnull@localhost>
Date:   Tue, 23 May 2006 03:55:45 +0000

fix _screen leak

Diffstat:
Msrc/libdraw/devdraw.c | 21+++++++--------------
Msrc/libdraw/x11-init.c | 2+-
2 files changed, 8 insertions(+), 15 deletions(-)

diff --git a/src/libdraw/devdraw.c b/src/libdraw/devdraw.c @@ -549,6 +549,8 @@ drawfreedimage(DImage *dimage) } ds = dimage->dscreen; l = dimage->image; + dimage->dscreen = nil; /* paranoia */ + dimage->image = nil; if(ds){ if(l->data == screenimage->data) addflush(l->layer->screenr); @@ -599,23 +601,14 @@ static int drawuninstall(Client *client, int id) { - DImage *d, *next; + DImage *d, **l; - d = client->dimage[id&HASHMASK]; - if(d == 0) - return -1; - if(d->id == id){ - client->dimage[id&HASHMASK] = d->next; - drawfreedimage(d); - return 0; - } - while(next = d->next){ /* assign = */ - if(next->id == id){ - d->next = next->next; - drawfreedimage(next); + for(l=&client->dimage[id&HASHMASK]; (d=*l) != nil; l=&d->next){ + if(d->id == id){ + *l = d->next; + drawfreedimage(d); return 0; } - d = next; } return -1; } diff --git a/src/libdraw/x11-init.c b/src/libdraw/x11-init.c @@ -154,6 +154,7 @@ getwindow(Display *d, int ref) d->image = i; /* fprint(2, "getwindow %p -> %p\n", oi, i); */ + freescreen(_screen); _screen = allocscreen(i, d->white, 0); _freeimage1(screen); screen = _allocwindow(screen, _screen, i->r, ref, DWhite); @@ -550,7 +551,6 @@ xattach(char *label) return _x.screenimage; err0: -fprint(2, "%r\n"); /* * Should do a better job of cleaning up here. */