diff options
| author | Charles.Forsyth <devnull@localhost> | 2008-11-05 14:39:48 +0000 |
|---|---|---|
| committer | Charles.Forsyth <devnull@localhost> | 2008-11-05 14:39:48 +0000 |
| commit | 63ef3c301e48e84f6453afba8099e964bccf8c2b (patch) | |
| tree | 6d6e0586f5d4f90558d2993bc0c05c4ba46bf44e /emu/port/dis.c | |
| parent | 232e2f2c786a3ab16e04539088e4aa4732ad8d77 (diff) | |
20081105-1439
Diffstat (limited to 'emu/port/dis.c')
| -rw-r--r-- | emu/port/dis.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/emu/port/dis.c b/emu/port/dis.c index 05feeb02..72fd52ab 100644 --- a/emu/port/dis.c +++ b/emu/port/dis.c @@ -118,6 +118,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) @@ -550,7 +558,7 @@ killgrp(Prog *p, char *msg) /* interpreter has been acquired */ g = p->group; - if(g == nil || g->head == nil) + if(g == nil || g->head == nil || g->flags & Pkilled) return 0; npid = 0; for(f = g->head; f != nil; f = f->grpnext) @@ -558,14 +566,16 @@ killgrp(Prog *p, char *msg) 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(); } @@ -575,6 +585,7 @@ killgrp(Prog *p, char *msg) killprog(f, msg); } poperror(); + g->flags &= ~Pkilled; free(pids); return 1; } |
