|
|
1.1 ! root 1: #include "u.h" ! 2: #include "../port/lib.h" ! 3: #include "mem.h" ! 4: #include "dat.h" ! 5: #include "fns.h" ! 6: #include "../port/error.h" ! 7: ! 8: static Ref pgrpid; ! 9: static Ref mountid; ! 10: ! 11: void ! 12: pgrpnote(ulong noteid, char *a, long n, int flag) ! 13: { ! 14: Proc *p, *ep; ! 15: char buf[ERRLEN]; ! 16: ! 17: if(n >= ERRLEN-1) ! 18: error(Etoobig); ! 19: ! 20: memmove(buf, a, n); ! 21: buf[n] = 0; ! 22: p = proctab(0); ! 23: ep = p+conf.nproc; ! 24: for(; p < ep; p++) { ! 25: if(p->state == Dead) ! 26: continue; ! 27: if(p != u->p && p->noteid == noteid && p->kp == 0) { ! 28: qlock(&p->debug); ! 29: if(p->pid == 0 || p->noteid != noteid){ ! 30: qunlock(&p->debug); ! 31: continue; ! 32: } ! 33: if(!waserror()) { ! 34: postnote(p, 0, buf, flag); ! 35: poperror(); ! 36: } ! 37: qunlock(&p->debug); ! 38: } ! 39: } ! 40: } ! 41: ! 42: Pgrp* ! 43: newpgrp(void) ! 44: { ! 45: Pgrp *p; ! 46: ! 47: p = smalloc(sizeof(Pgrp)); ! 48: p->ref = 1; ! 49: p->pgrpid = incref(&pgrpid); ! 50: return p; ! 51: } ! 52: ! 53: void ! 54: closepgrp(Pgrp *p) ! 55: { ! 56: Mhead **h, **e, *f, *next; ! 57: ! 58: if(decref(p) == 0){ ! 59: qlock(&p->debug); ! 60: p->pgrpid = -1; ! 61: ! 62: e = &p->mnthash[MNTHASH]; ! 63: for(h = p->mnthash; h < e; h++) { ! 64: for(f = *h; f; f = next) { ! 65: close(f->from); ! 66: mountfree(f->mount); ! 67: next = f->hash; ! 68: free(f); ! 69: } ! 70: } ! 71: qunlock(&p->debug); ! 72: free(p); ! 73: } ! 74: } ! 75: ! 76: void ! 77: pgrpcpy(Pgrp *to, Pgrp *from) ! 78: { ! 79: Mhead **h, **e, *f, **tom, **l, *mh; ! 80: Mount *n, *m, **link; ! 81: ! 82: rlock(&from->ns); ! 83: ! 84: e = &from->mnthash[MNTHASH]; ! 85: tom = to->mnthash; ! 86: for(h = from->mnthash; h < e; h++) { ! 87: l = tom++; ! 88: for(f = *h; f; f = f->hash) { ! 89: mh = smalloc(sizeof(Mhead)); ! 90: mh->from = f->from; ! 91: incref(mh->from); ! 92: *l = mh; ! 93: l = &mh->hash; ! 94: link = &mh->mount; ! 95: for(m = f->mount; m; m = m->next) { ! 96: n = newmount(mh, m->to); ! 97: *link = n; ! 98: link = &n->next; ! 99: } ! 100: } ! 101: } ! 102: runlock(&from->ns); ! 103: } ! 104: ! 105: Fgrp* ! 106: dupfgrp(Fgrp *f) ! 107: { ! 108: Fgrp *new; ! 109: Chan *c; ! 110: int i; ! 111: ! 112: new = smalloc(sizeof(Fgrp)); ! 113: new->ref = 1; ! 114: ! 115: lock(f); ! 116: new->maxfd = f->maxfd; ! 117: for(i = 0; i <= f->maxfd; i++) { ! 118: if(c = f->fd[i]){ ! 119: incref(c); ! 120: new->fd[i] = c; ! 121: } ! 122: } ! 123: unlock(f); ! 124: ! 125: return new; ! 126: } ! 127: ! 128: void ! 129: closefgrp(Fgrp *f) ! 130: { ! 131: int i; ! 132: Chan *c; ! 133: ! 134: if(decref(f) == 0) { ! 135: for(i = 0; i <= f->maxfd; i++) ! 136: if(c = f->fd[i]) ! 137: close(c); ! 138: ! 139: free(f); ! 140: } ! 141: } ! 142: ! 143: ! 144: Mount* ! 145: newmount(Mhead *mh, Chan *to) ! 146: { ! 147: Mount *m; ! 148: ! 149: m = smalloc(sizeof(Mount)); ! 150: m->to = to; ! 151: m->head = mh; ! 152: incref(to); ! 153: m->mountid = incref(&mountid); ! 154: return m; ! 155: } ! 156: ! 157: void ! 158: mountfree(Mount *m) ! 159: { ! 160: Mount *f; ! 161: ! 162: while(m) { ! 163: f = m->next; ! 164: close(m->to); ! 165: free(m); ! 166: m = f; ! 167: } ! 168: } ! 169: ! 170: void ! 171: resrcwait(char *reason) ! 172: { ! 173: char *p; ! 174: ! 175: p = u->p->psstate; ! 176: if(reason) { ! 177: u->p->psstate = reason; ! 178: print("%s\n", reason); ! 179: } ! 180: if(u == 0) ! 181: panic("resrcwait"); ! 182: ! 183: tsleep(&u->p->sleep, return0, 0, 300); ! 184: u->p->psstate = p; ! 185: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.