From 5632d6e5bd251342783b542854b21b3c682c2054 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 28 Apr 1992 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1992-04-28 --- port/devcons.c | 45 +++++++++++---------- port/devproc.c | 39 +++++-------------- port/pgrp.c | 15 ++++--- port/portdat.h | 16 ++++++-- port/portfns.h | 2 +- port/proc.c | 4 +- port/sysproc.c | 99 ++++++++++++++++++++++++++++++++++++++++------- port/systab.h | 12 +++--- port/taslock.c | 5 ++- power/devhotrod.c | 1 + 10 files changed, 157 insertions(+), 81 deletions(-) diff --git a/port/devcons.c b/port/devcons.c index d50cf17f7e6f0832197738acee5c1d4000f68e1b..718716b2f073837364c32c5ec9b6ba73fbbc5ada 100644 --- a/port/devcons.c +++ b/port/devcons.c @@ -325,50 +325,52 @@ consactive(void) } enum{ - Qdir, + Qchal, + Qclock, Qcons, Qconsctl, Qcputime, + Qcrypt, + Qdir, + Qkey, + Qklog, Qlights, + Qmsec, Qnoise, + Qnoteid, Qnull, Qpgrpid, Qpid, Qppid, - Qtime, - Quser, - Qklog, - Qmsec, - Qclock, - Qsysstat, Qswap, - Qcrypt, - Qkey, - Qchal, Qsysname, + Qsysstat, + Qtime, + Quser, }; Dirtab consdir[]={ + "chal", {Qchal}, 8, 0666, + "clock", {Qclock}, 2*NUMSIZE, 0444, "cons", {Qcons}, 0, 0660, "consctl", {Qconsctl}, 0, 0220, "cputime", {Qcputime}, 6*NUMSIZE, 0444, - "time", {Qtime}, NUMSIZE, 0664, - "clock", {Qclock}, 2*NUMSIZE, 0444, - "msec", {Qmsec}, NUMSIZE, 0444, + "crypt", {Qcrypt}, 0, 0666, + "key", {Qkey}, DESKEYLEN, 0622, + "klog", {Qklog}, 0, 0444, "lights", {Qlights}, 0, 0220, + "msec", {Qmsec}, NUMSIZE, 0444, "noise", {Qnoise}, 0, 0220, + "noteid", {Qnoteid}, NUMSIZE, 0444, "null", {Qnull}, 0, 0666, "pgrpid", {Qpgrpid}, NUMSIZE, 0444, "pid", {Qpid}, NUMSIZE, 0444, "ppid", {Qppid}, NUMSIZE, 0444, - "user", {Quser}, 0, 0666, - "chal", {Qchal}, 8, 0666, - "crypt", {Qcrypt}, 0, 0666, - "key", {Qkey}, DESKEYLEN, 0622, - "klog", {Qklog}, 0, 0444, - "sysstat", {Qsysstat}, 0, 0666, - "sysname", {Qsysname}, 0, 0664, "swap", {Qswap}, 0, 0664, + "sysname", {Qsysname}, 0, 0664, + "sysstat", {Qsysstat}, 0, 0666, + "time", {Qtime}, NUMSIZE, 0664, + "user", {Quser}, 0, 0666, }; #define NCONS (sizeof consdir/sizeof(Dirtab)) @@ -570,6 +572,9 @@ consread(Chan *c, void *buf, long n, ulong offset) case Qpgrpid: return readnum(offset, buf, n, u->p->pgrp->pgrpid, NUMSIZE); + case Qnoteid: + return readnum(offset, buf, n, u->p->noteid, NUMSIZE); + case Qpid: return readnum(offset, buf, n, u->p->pid, NUMSIZE); diff --git a/port/devproc.c b/port/devproc.c index 29a4ef40dc8b8ca1a9896ceef4e60eb375432c6b..47738de2c1da56192320e2fc18353c4812565e4c 100644 --- a/port/devproc.c +++ b/port/devproc.c @@ -42,17 +42,18 @@ char *sname[]={ "Text", "Data", "Bss", "Stack", "Shared", "Phys" }; * 23 bits of process slot number + 1 * in vers, * 32 bits of pid, for consistency checking - * If notepg, c->pgrpid.path is pgrp slot, .vers is pgrpid. + * If notepg, c->pgrpid.path is pgrp slot, .vers is noteid. */ #define NPROC (sizeof procdir/sizeof(Dirtab)) #define QSHIFT 4 /* location in qid of proc slot # */ -#define QID(q) (((q).path&0x0000000F)>>0) -#define SLOT(q) ((((q).path&0x07FFFFFF0)>>QSHIFT)-1) -#define PID(q) ((q).vers) + +#define QID(q) (((q).path&0x0000000F)>>0) +#define SLOT(q) ((((q).path&0x07FFFFFF0)>>QSHIFT)-1) +#define PID(q) ((q).vers) +#define NOTEID(q) ((q).vers) void procctlreq(Proc*, char*, int); int procctlmemio(Proc*, ulong, int, void*, int); -Chan *procctlnotepg(Chan*, void*, int); Chan *proctext(Chan*, Proc*); Segment *txt2data(Proc*, Segment*); int procstopped(void*); @@ -171,7 +172,7 @@ procopen(Chan *c, int omode) if(omode!=OWRITE || pg->pgrpid==1) /* easy to do by mistake */ error(Eperm); c->pgrpid.path = pg->index+1; - c->pgrpid.vers = pg->pgrpid; + c->pgrpid.vers = p->noteid; break; default: pprint("procopen %lux\n", c->qid); @@ -386,9 +387,9 @@ procwrite(Chan *c, void *va, long n, ulong offset) p = proctab(SLOT(c->qid)); - /* Use the remembered pgrp id in the channel rather than the process pgrpid */ - if(QID(c->qid) == Qnotepg){ - procctlnotepg(c, va, n); + /* Use the remembered noteid in the channel rather than the process pgrpid */ + if(QID(c->qid) == Qnotepg) { + pgrpnote(NOTEID(c->pgrpid), va, n, NUser); return n; } @@ -509,26 +510,6 @@ proctext(Chan *c, Proc *p) return tc; } -Chan * -procctlnotepg(Chan *c, void *va, int n) -{ - Pgrp *pg; - - pg = pgrptab(c->pgrpid.path-1); - qlock(&pg->debug); - if(waserror()){ - qunlock(&pg->debug); - nexterror(); - } - if(pg->pgrpid != c->pgrpid.vers){ - qunlock(&pg->debug); - error(Eprocdied); - } - pgrpnote(pg, va, n, NUser); - poperror(); - qunlock(&pg->debug); -} - void procstopwait(Proc *p, int ctl) { diff --git a/port/pgrp.c b/port/pgrp.c index fe366737812cdcf90e02110e18677b5a1d2e85a7..224c07e94d9a886110854b622079ffb0289a170f 100644 --- a/port/pgrp.c +++ b/port/pgrp.c @@ -74,21 +74,24 @@ pgrptab(int i) } void -pgrpnote(Pgrp *pg, char *a, long n, int flag) +pgrpnote(ulong noteid, char *a, long n, int flag) { - int i; - Proc *p; + Proc *p, *ep; char buf[ERRLEN]; if(n >= ERRLEN-1) error(Etoobig); + memmove(buf, a, n); buf[n] = 0; p = proctab(0); - for(i=0; ipgrp == pg && p->kp == 0) { + ep = p+conf.nproc; + for(; p < ep; p++) { + if(p->state == Dead) + continue; + if(p->noteid == noteid && p->kp == 0) { qlock(&p->debug); - if(p->pid==0 || p->pgrp!=pg){ + if(p->pid==0 || p->noteid != noteid){ qunlock(&p->debug); continue; } diff --git a/port/portdat.h b/port/portdat.h index f61ff891b3c41126e2c46b9901931dff68888d67..f77b3aae0261bce16ea46c4c4fa085e26e29b1db 100644 --- a/port/portdat.h +++ b/port/portdat.h @@ -458,9 +458,15 @@ enum /* Argument to forkpgrp call */ enum { - Forkpg = 1, - Forkeg = 2, - Forkfd = 4, + FORKNSG = (1<<0), + FORKEVG = (1<<1), + FORKFDG = (1<<2), + FORKNTG = (1<<3), + FORKPCS = (1<<4), + FORKMEM = (1<<5), + FORKCNSG = (1<<10), + FORKCEVG = (1<<11), + FORKCFDG = (1<<12) }; /* @@ -522,10 +528,11 @@ struct Proc QLock *qlock; /* address of qlock being queued for DEBUG */ ulong qlockpc; /* pc of last call to qlock */ int state; - char *psstate; /* What /proc/???/status reports */ + char *psstate; /* What /proc/#/status reports */ Page *upage; /* BUG: should be unlinked from page list */ Segment *seg[NSEG]; ulong pid; + ulong noteid; /* Equivalent of note group */ Lock exl; /* Lock count and waitq */ Waitq *waitq; /* Exited processes wait children */ @@ -696,6 +703,7 @@ extern char eve[]; extern int nrdy; extern char sysname[NAMELEN]; extern int cpuserver; +extern Ref noteidalloc; #define CHDIR 0x80000000L #define CHAPPEND 0x40000000L diff --git a/port/portfns.h b/port/portfns.h index 8d6ea8bb5bb635cbd47a12a5789843328b6856e9..f93e3f92b611682ca6074885599143e70973b246 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -155,7 +155,7 @@ void pageinit(void); void panic(char*, ...); void pexit(char*, int); void pgrpcpy(Pgrp*, Pgrp*); -void pgrpnote(Pgrp*, char*, long, int); +void pgrpnote(ulong, char*, long, int); Pgrp* pgrptab(int); void pio(Segment *, ulong, ulong, Page **); #define poperror() u->nerrlab-- diff --git a/port/proc.c b/port/proc.c index 0d89ea7184cff45ac2811191b8380849920f93bf..dbf179f3215697cb39953af4ca20b952b8614ea0 100644 --- a/port/proc.c +++ b/port/proc.c @@ -6,6 +6,7 @@ #include "../port/error.h" Ref pidalloc; +Ref noteidalloc; struct { @@ -229,7 +230,8 @@ newproc(void) p->notepending = 0; memset(p->seg, 0, sizeof p->seg); p->pid = incref(&pidalloc); - if(p->pid == 0) + p->noteid = incref(¬eidalloc); + if(p->pid==0 || p->noteid==0) panic("pidalloc"); return p; } diff --git a/port/sysproc.c b/port/sysproc.c index fadcefa17862c73501fa700740fcd8b0990e93ed..89aff1c48351623ed8f0baef318e7cfd45f416fc 100644 --- a/port/sysproc.c +++ b/port/sysproc.c @@ -21,7 +21,13 @@ long sysfork(ulong *arg) { USED(arg); - return rfork(Forkfd); + return rfork(FORKFDG|FORKPCS); +} + +long +sys__rfork__(ulong *arg) +{ + return rfork(arg[0]|FORKPCS); } /* This call will obsolete fork */ @@ -40,11 +46,48 @@ rfork(ulong flag) int n, on, i; Chan *c; KMap *k; + Pgrp *opg; + Egrp *oeg; + Fgrp *ofg; /* * used to compute last valid system stack address for copy */ int lastvar; + p = u->p; + if((flag&FORKPCS) == 0) { + if(flag & (FORKNSG|FORKCNSG)) { + if((flag & (FORKNSG|FORKCNSG)) == (FORKNSG|FORKCNSG)) + error(Ebadarg); + opg = p->pgrp; + p->pgrp = newpgrp(); + if(flag & FORKNSG) + pgrpcpy(p->pgrp, opg); + closepgrp(opg); + } + if(flag & (FORKEVG|FORKCEVG)) { + if((flag & (FORKEVG|FORKCEVG)) == (FORKEVG|FORKCEVG)) + error(Ebadarg); + oeg = p->egrp; + p->egrp = newegrp(); + if(flag & FORKEVG) + envcpy(p->egrp, oeg); + closeegrp(oeg); + } + if(flag & FORKFDG) + error(Ebadarg); + if(flag & FORKCFDG) { + ofg = p->fgrp; + p->fgrp = newfgrp(); + closefgrp(ofg); + } + if(flag & FORKNTG) + p->noteid = incref(¬eidalloc); + if(flag & FORKMEM) + error(Ebadarg); + return 0; + } + p = newproc(); /* Page va of upage used as check in mapstack */ @@ -66,30 +109,57 @@ rfork(ulong flag) p->seg[i] = dupseg(u->p->seg[i]); /* Refs */ - incref(u->dot); /* File descriptors etc. */ + incref(u->dot); + + if(flag & FORKMEM) + error(Egreg); - if(flag & Forkfd) - p->fgrp = dupfgrp(u->p->fgrp); - else{ + /* File descriptors */ + if(flag & (FORKFDG|FORKCFDG)) { + if((flag & (FORKFDG|FORKCFDG)) == (FORKFDG|FORKCFDG)) + error(Ebadarg); + if(flag & FORKFDG) + p->fgrp = dupfgrp(u->p->fgrp); + else + if(flag & FORKCFDG) + p->fgrp = newfgrp(); + } + else { p->fgrp = u->p->fgrp; incref(p->fgrp); } - if(flag & Forkpg) { - p->pgrp = newpgrp(); - pgrpcpy(p->pgrp, u->p->pgrp); + /* Process groups */ + if(flag & (FORKNSG|FORKCNSG)) { + if((flag & (FORKNSG|FORKCNSG)) == (FORKNSG|FORKCNSG)) + error(Ebadarg); + if(flag & FORKNSG) { + p->pgrp = newpgrp(); + pgrpcpy(p->pgrp, u->p->pgrp); + } + else + if(flag & FORKCNSG) + p->pgrp = newpgrp(); } else { - p->pgrp = u->p->pgrp; /* Process groups */ + p->pgrp = u->p->pgrp; incref(p->pgrp); } - if(flag & Forkeg) { - p->egrp = newegrp(); - envcpy(p->egrp, u->p->egrp); + /* Environment group */ + if(flag & (FORKEVG|FORKCEVG)) { + if((flag & (FORKEVG|FORKCEVG)) == (FORKEVG|FORKCEVG)) + error(Ebadarg); + if(flag & FORKEVG) { + p->egrp = newegrp(); + envcpy(p->egrp, u->p->egrp); + } + else + if(flag & FORKCEVG) + p->egrp = newegrp(); } else { - p->egrp = u->p->egrp; /* Environment group */ + p->egrp = u->p->egrp; incref(p->egrp); } @@ -111,6 +181,8 @@ rfork(ulong flag) p->parent = u->p; p->parentpid = u->p->pid; + if((flag&FORKNTG) == 0) + p->noteid = u->p->noteid; p->fpstate = u->p->fpstate; lock(&u->p->exl); @@ -513,6 +585,7 @@ sysforkpgrp(ulong *arg) u->notified = 0; memset(u->note, 0, sizeof(u->note)); } + u->p->noteid = incref(¬eidalloc); poperror(); closepgrp(u->p->pgrp); diff --git a/port/systab.h b/port/systab.h index e3af2fde285e77b91200a522a6be3422d30016b0..5dddfc5990fbdd87bf5d9737c52fefd1dc6a3c87 100644 --- a/port/systab.h +++ b/port/systab.h @@ -22,11 +22,11 @@ Syscall sysread; Syscall sysseek; Syscall syssleep; Syscall sysstat; -Syscall sys__wait__; +Syscall sysrfork; Syscall syswrite; Syscall syspipe; Syscall syscreate; -Syscall sysrfork; +Syscall sys__rfork__; Syscall sysbrk_; Syscall sysremove; Syscall syswstat; @@ -61,11 +61,11 @@ Syscall *systab[]={ [SEEK] sysseek, [SLEEP] syssleep, [STAT] sysstat, - [__WAIT__] sys__wait__, + [RFORK] sysrfork, [WRITE] syswrite, [PIPE] syspipe, [CREATE] syscreate, - [RFORK] sysrfork, + [__RFORK__] sys__rfork__, [BRK_] sysbrk_, [REMOVE] sysremove, [WSTAT] syswstat, @@ -101,11 +101,11 @@ char *sysctab[]={ [SEEK] "Seek", [SLEEP] "Sleep", [STAT] "Stat", - [__WAIT__] "__wait_", + [RFORK] "Rfork", [WRITE] "Write", [PIPE] "Pipe", [CREATE] "Create", - [RFORK] "Rfork", + [__RFORK__] "__rfork_", [BRK_] "Brk", [REMOVE] "Remove", [WSTAT] "Wstat", diff --git a/port/taslock.c b/port/taslock.c index 477d37bf4357615aac11cee9b3412f2e9c9e2fdf..3092e8519a865f35a5fd127f2e195b648f907e1d 100644 --- a/port/taslock.c +++ b/port/taslock.c @@ -13,7 +13,10 @@ lock(Lock *l) ulong pc; pc = getcallerpc(((uchar*)&l) - sizeof(l)); - +if(l == 0){ +print("pc= %lux", pc); +for(;;); +} for(i = 0; i < 1000000; i++){ if (tas(&ll->key) == 0){ if(u) diff --git a/power/devhotrod.c b/power/devhotrod.c index fbfaae36990864fea0aeb8f1107f14eba8d7f312..61ca1af5b73c982ffd392cb4ed9809e38005ace1 100644 --- a/power/devhotrod.c +++ b/power/devhotrod.c @@ -55,6 +55,7 @@ Hotmsg** hotsend(Commrod *h, Hotmsg *m) { Hotmsg **mp; +int i; lock(h); mp = (Hotmsg**)&h->addr->reqstq[h->wi];