Blob
1 static int fforkstacksize = 16384;3 typedef struct Stack Stack;4 struct Stack5 {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 void43 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 void60 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 }