summaryrefslogtreecommitdiff
path: root/os/port
diff options
context:
space:
mode:
authorCharles.Forsyth <devnull@localhost>2008-11-06 11:19:52 +0000
committerCharles.Forsyth <devnull@localhost>2008-11-06 11:19:52 +0000
commitd3ba796f4932de1b69a999a9b9ed27368ae24d74 (patch)
tree5b9320dfc22e5c5b0f29024ee91282dc7989f743 /os/port
parent63ef3c301e48e84f6453afba8099e964bccf8c2b (diff)
20081106-1118
Diffstat (limited to 'os/port')
-rw-r--r--os/port/dis.c17
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;
}