Blob


1 static int fforkstacksize = 16384;
3 typedef struct Stack Stack;
4 struct Stack
5 {
6 Stack *next;
7 Stack *fnext;
8 int pid;
9 };
11 static Lock stacklock;
12 static Stack *freestacks;
13 static Stack *allstacks;
14 static int stackmallocs;
15 static void gc(void);
17 static void*
18 mallocstack(void)
19 {
20 Stack *p;
22 lock(&stacklock);
23 top:
24 p = freestacks;
25 if(p)
26 freestacks = p->fnext;
27 else{
28 if(stackmallocs++%1 == 0)
29 gc();
30 if(freestacks)
31 goto top;
32 p = malloc(fforkstacksize);
33 p->next = allstacks;
34 allstacks = p;
35 }
36 if(p)
37 p->pid = 1;
38 unlock(&stacklock);
39 return p;
40 }
42 static void
43 gc(void)
44 {
45 Stack *p;
47 for(p=allstacks; p; p=p->next){
48 if(p->pid > 1 && procexited(p->pid)){
49 if(0) fprint(2, "reclaim stack from %d\n", p->pid);
50 p->pid = 0;
51 }
52 if(p->pid == 0){
53 p->fnext = freestacks;
54 freestacks = p;
55 }
56 }
57 }
59 static void
60 freestack(void *v)
61 {
62 Stack *p;
64 p = v;
65 if(p == nil)
66 return;
67 lock(&stacklock);
68 p->fnext = freestacks;
69 p->pid = 0;
70 freestacks = p;
71 unlock(&stacklock);
72 return;
73 }