summaryrefslogtreecommitdiff
path: root/emu
diff options
context:
space:
mode:
authorCharles.Forsyth <devnull@localhost>2008-11-05 14:39:48 +0000
committerCharles.Forsyth <devnull@localhost>2008-11-05 14:39:48 +0000
commit63ef3c301e48e84f6453afba8099e964bccf8c2b (patch)
tree6d6e0586f5d4f90558d2993bc0c05c4ba46bf44e /emu
parent232e2f2c786a3ab16e04539088e4aa4732ad8d77 (diff)
20081105-1439
Diffstat (limited to 'emu')
-rw-r--r--emu/port/dis.c15
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;
}