tfix _screen leak - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 24c4c46b98e19733700cdb0bccf1c56577f0f56a
 (DIR) parent 4b65e43c54c2ca1394babed18cc02f4fffc22e16
 (HTM) Author: rsc <devnull@localhost>
       Date:   Tue, 23 May 2006 03:55:45 +0000
       
       fix _screen leak
       
       Diffstat:
         M src/libdraw/devdraw.c               |      21 +++++++--------------
         M src/libdraw/x11-init.c              |       2 +-
       
       2 files changed, 8 insertions(+), 15 deletions(-)
       ---
 (DIR) diff --git a/src/libdraw/devdraw.c b/src/libdraw/devdraw.c
       t@@ -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);
       t@@ -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;
        }
 (DIR) diff --git a/src/libdraw/x11-init.c b/src/libdraw/x11-init.c
       t@@ -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);
       t@@ -550,7 +551,6 @@ xattach(char *label)
                return _x.screenimage;
        
        err0:
       -fprint(2, "%r\n");
                /*
                 * Should do a better job of cleaning up here.
                 */