| plan 9 kernel history: overview | file list | diff list |
1991/0514/port/pgrp.c (diff list | history)
| port/pgrp.c on 1990/0227 | ||
| 1990/0227 | #include "u.h" #include "lib.h" #include "mem.h" #include "dat.h" #include "fns.h" #include "errno.h" struct{ Lock; | |
| 1990/1110 | Pgrp *arena; | |
| 1990/0227 | Pgrp *free; ulong pgrpid; }pgrpalloc; struct{ Lock; Mount *free; ulong mountid; }mountalloc; void pgrpinit(void) { int i; Pgrp *p; Mount *m; | |
| 1990/1110 | pgrpalloc.arena = ialloc(conf.npgrp*sizeof(Pgrp), 0); pgrpalloc.free = pgrpalloc.arena; | |
| 1990/0227 | p = pgrpalloc.free; | |
| 1990/0825 | for(i=0; i<conf.npgrp; i++,p++){ | |
| 1990/1110 | p->index = i; | |
| 1990/0227 | p->next = p+1; p->mtab = ialloc(conf.nmtab*sizeof(Mtab), 0); p->etab = ialloc(conf.npgenv*sizeof(Envp*), 0); } | |
| 1990/0825 | p[-1].next = 0; | |
| 1990/0227 | mountalloc.free = ialloc(conf.nmount*sizeof(Mount), 0); m = mountalloc.free; for(i=0; i<conf.nmount-1; i++,m++) m->next = m+1; m->next = 0; } Pgrp* | |
| 1990/1110 | pgrptab(int i) { return &pgrpalloc.arena[i]; } void pgrpnote(Pgrp *pg, char *a, long n, int flag) { int i; Proc *p; char buf[ERRLEN]; if(n >= ERRLEN-1) | |
| 1990/11211 | error(Etoobig); | |
| 1990/1110 | if(n>=4 && strncmp(a, "sys:", 4)==0) | |
| 1990/11211 | error(Ebadarg); | |
| 1991/0318 | memmove(buf, a, n); | |
| 1990/1110 | buf[n] = 0; p = proctab(0); for(i=0; i<conf.nproc; i++, p++){ if(p->pgrp == pg){ lock(&p->debug); if(p->pid==0 || p->pgrp!=pg){ unlock(&p->debug); continue; } | |
| 1991/0125 | if(!waserror()){ postnote(p, 0, buf, flag); poperror(); | |
| 1990/1110 | } unlock(&p->debug); } } } Pgrp* | |
| 1990/0227 | newpgrp(void) { Pgrp *p; loop: lock(&pgrpalloc); if(p = pgrpalloc.free){ /* assign = */ pgrpalloc.free = p->next; p->ref = 1; p->pgrpid = ++pgrpalloc.pgrpid; p->nmtab = 0; p->nenv = 0; unlock(&pgrpalloc); return p; } unlock(&pgrpalloc); print("no pgrps\n"); if(u == 0) panic("newpgrp"); u->p->state = Wakeme; alarm(1000, wakeme, u->p); sched(); goto loop; } void closepgrp(Pgrp *p) { int i; Mtab *m; Envp *ep; if(decref(p) == 0){ | |
| 1991/0212 | qlock(&p->debug); | |
| 1990/1110 | p->pgrpid = -1; | |
| 1990/0227 | m = p->mtab; for(i=0; i<p->nmtab; i++,m++) if(m->c){ close(m->c); closemount(m->mnt); } ep = p->etab; for(i=0; i<p->nenv; i++,ep++) if(ep->env) envpgclose(ep->env); lock(&pgrpalloc); p->next = pgrpalloc.free; pgrpalloc.free = p; | |
| 1991/0212 | qunlock(&p->debug); | |
| 1990/0227 | unlock(&pgrpalloc); } } Mount* newmount(void) { Mount *m; loop: lock(&mountalloc); if(m = mountalloc.free){ /* assign = */ mountalloc.free = m->next; m->ref = 1; | |
| 1990/0928 | m->next = 0; | |
| 1990/0227 | m->mountid = ++mountalloc.mountid; unlock(&mountalloc); return m; } unlock(&mountalloc); print("no mounts\n"); if(u == 0) panic("newmount"); u->p->state = Wakeme; alarm(1000, wakeme, u->p); sched(); goto loop; } void closemount(Mount *m) { lock(m); if(m->ref == 1){ | |
| 1990/0321 | if(m->c) close(m->c); | |
| 1990/0227 | if(m->next) closemount(m->next); unlock(m); lock(&mountalloc); m->mountid = 0; m->next = mountalloc.free; mountalloc.free = m; unlock(&mountalloc); return; } m->ref--; unlock(m); } void | |
| 1991/0514 | envcpy(Pgrp *to, Pgrp *from) | |
| 1990/0227 | { Envp *ep; Env *e; | |
| 1991/0514 | int i; | |
| 1990/0227 | lock(from); to->nenv = from->nenv; ep = to->etab; for(i=0; i<from->nenv; i++,ep++){ ep->chref = 0; e = ep->env = from->etab[i].env; if(e){ lock(e); if(waserror()){ unlock(e); unlock(from); ep->env = 0; nexterror(); } /* * If pgrp being forked has an open channel * on this env, it may write it after the fork * so make a copy now. * Don't worry about other pgrps, because they * will copy if they are about to write. */ if(from->etab[i].chref){ ep->env = copyenv(e, 0); unlock(ep->env); }else e->pgref++; poperror(); unlock(e); } } | |
| 1991/0514 | unlock(from); } void pgrpcpy(Pgrp *to, Pgrp *from) { int i; Mtab *m; lock(from); memmove(to->user, from->user, NAMELEN); memmove(to->mtab, from->mtab, from->nmtab*sizeof(Mtab)); to->nmtab = from->nmtab; m = to->mtab; for(i=0; i<from->nmtab; i++,m++) if(m->c){ incref(m->c); lock(m->mnt); m->mnt->ref++; unlock(m->mnt); } | |
| 1990/0227 | unlock(from); } | |