|
|
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.