From 725d9fd7952a63c09f50d5544d0b306177462d43 Mon Sep 17 00:00:00 2001 From: rsc Date: Thu, 28 Jul 2005 04:47:00 +0000 Subject: winunlock bug --- src/cmd/acme/wind.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/cmd/acme/wind.c b/src/cmd/acme/wind.c index 5d409a98..2f015feb 100644 --- a/src/cmd/acme/wind.c +++ b/src/cmd/acme/wind.c @@ -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; intext; i++) winlock1(f->text[i]->w, owner); @@ -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; intext; 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 */ } } -- cgit v1.2.3