diff options
| author | rsc <devnull@localhost> | 2004-11-08 16:03:42 +0000 |
|---|---|---|
| committer | rsc <devnull@localhost> | 2004-11-08 16:03:42 +0000 |
| commit | cf4f3eafc6016ccdb57773215dcdd5ebac95c07d (patch) | |
| tree | 8ec61fb34fb6a0fe9d7bd79c65487b9a1ec4bb81 /src/libthread/procstack.ch | |
| parent | 195645536743aeb99eb336726823c38716cec02d (diff) | |
extra files
Diffstat (limited to 'src/libthread/procstack.ch')
| -rw-r--r-- | src/libthread/procstack.ch | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/libthread/procstack.ch b/src/libthread/procstack.ch new file mode 100644 index 00000000..ccf81866 --- /dev/null +++ b/src/libthread/procstack.ch @@ -0,0 +1,75 @@ +static int fforkstacksize = 16384; + +typedef struct Stack Stack; +struct Stack +{ + Stack *next; + Stack *fnext; + int pid; +}; + +static Lock stacklock; +static Stack *freestacks; +static Stack *allstacks; +static int stackmallocs; +static void gc(void); + +static void* +mallocstack(void) +{ + Stack *p; + + lock(&stacklock); +top: + p = freestacks; + if(p) + freestacks = p->fnext; + else{ + if(stackmallocs++%1 == 0) + gc(); + if(freestacks) + goto top; + p = malloc(fforkstacksize); + p->next = allstacks; + allstacks = p; + } + if(p) + p->pid = 1; + unlock(&stacklock); + return p; +} + +static void +gc(void) +{ + Stack *p; + + for(p=allstacks; p; p=p->next){ + if(p->pid > 1 && procexited(p->pid)){ + if(0) fprint(2, "reclaim stack from %d\n", p->pid); + p->pid = 0; + } + if(p->pid == 0){ + p->fnext = freestacks; + freestacks = p; + } + } +} + +static void +freestack(void *v) +{ + Stack *p; + + p = v; + if(p == nil) + return; + lock(&stacklock); + p->fnext = freestacks; + p->pid = 0; + freestacks = p; + unlock(&stacklock); + return; +} + + |