URI: 
       twinunlock bug - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 725d9fd7952a63c09f50d5544d0b306177462d43
   DIR parent 34e8254fb8cc206664fc9dcba3c7c8ae1de6ab85
  HTML Author: rsc <devnull@localhost>
       Date:   Thu, 28 Jul 2005 04:47:00 +0000
       
       winunlock bug
       
       Diffstat:
         M src/cmd/acme/wind.c                 |      12 ++++++------
       
       1 file changed, 6 insertions(+), 6 deletions(-)
       ---
   DIR diff --git a/src/cmd/acme/wind.c b/src/cmd/acme/wind.c
       t@@ -145,7 +145,6 @@ winlock(Window *w, int owner)
                int i;
                File *f;
        
       -//fprint(2, "winlock %p %d %lux\n", w, owner, getcallerpc(&w));
                f = w->body.file;
                for(i=0; i<f->ntext; i++)
                        winlock1(f->text[i]->w, owner);
       t@@ -157,16 +156,17 @@ winunlock(Window *w)
                int i;
                File *f;
        
       -//fprint(2, "winunlock %p %lux\n", w, getcallerpc(&w));
       +        /*
       +         * subtle: loop runs backwards to avoid tripping over
       +         * winclose indirectly editing f->text and freeing f
       +         * on the last iteration of the loop.
       +         */
                f = w->body.file;
       -        for(i=0; i<f->ntext; i++){
       +        for(i=f->ntext-1; i>=0; i--){
                        w = f->text[i]->w;
                        w->owner = 0;
                        qunlock(&w->lk);
                        winclose(w);
       -                /* winclose() can change up f->text; beware */
       -                if(f->ntext>0 && w != f->text[i]->w)
       -                        --i;        /* winclose() deleted window */
                }
        }