diff options
| author | Charles.Forsyth <devnull@localhost> | 2008-11-06 11:19:52 +0000 |
|---|---|---|
| committer | Charles.Forsyth <devnull@localhost> | 2008-11-06 11:19:52 +0000 |
| commit | d3ba796f4932de1b69a999a9b9ed27368ae24d74 (patch) | |
| tree | 5b9320dfc22e5c5b0f29024ee91282dc7989f743 /os/port/dis.c | |
| parent | 63ef3c301e48e84f6453afba8099e964bccf8c2b (diff) | |
20081106-1118
Diffstat (limited to 'os/port/dis.c')
| -rw-r--r-- | os/port/dis.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/os/port/dis.c b/os/port/dis.c index 2b5ac937..8859a1b9 100644 --- a/os/port/dis.c +++ b/os/port/dis.c @@ -134,6 +134,14 @@ newprog(Prog *p, Modlink *m) Osenv *on, *op; static int pidnum; + if(p != nil){ + if(p->group != nil) + p->flags |= p->group->flags & Pkilled; + if(p->kill != nil) + error(p->kill); + if(p->flags & Pkilled) + error(""); + } n = malloc(sizeof(Prog)+sizeof(Osenv)); if(n == 0){ if(p == nil) @@ -564,20 +572,26 @@ killgrp(Prog *p, char *msg) g = p->group; if(g == nil || g->head == nil) return 0; + while(g->flags & Pkilled){ + release(); + acquire(); + } npid = 0; for(f = g->head; f != nil; f = f->grpnext) if(f->group != g) panic("killgrp"); else npid++; - /* use pids not Prog* because state can change during killprog */ + /* use pids not Prog* because state can change during killprog (eg, in delprog) */ pids = malloc(npid*sizeof(int)); if(pids == nil) error(Enomem); npid = 0; for(f = g->head; f != nil; f = f->grpnext) pids[npid++] = f->pid; + g->flags |= Pkilled; if(waserror()) { + g->flags &= ~Pkilled; free(pids); nexterror(); } @@ -587,6 +601,7 @@ killgrp(Prog *p, char *msg) killprog(f, msg); } poperror(); + g->flags &= ~Pkilled; free(pids); return 1; } |
