diff options
| -rw-r--r-- | CHANGES | 3 | ||||
| -rw-r--r-- | emu/port/dis.c | 15 | ||||
| -rw-r--r-- | include/version.h | 2 |
3 files changed, 17 insertions, 3 deletions
@@ -1,3 +1,6 @@ +20081105 + emu/port/dis.c change to killgrp to prevent new spawns during kill [#117] + (will do os/port/dis.c later) 20081022 sh: ignore leading white space in fail: strings, and change empty tail to "failed" /emu/port/devfs-posix.c don't call readdir after it has returned end of file 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; } diff --git a/include/version.h b/include/version.h index 6c69520e..d1540b2f 100644 --- a/include/version.h +++ b/include/version.h @@ -1 +1 @@ -#define VERSION "Fourth Edition (20081104)" +#define VERSION "Fourth Edition (20081105)" |
