diff --git a/src/gc-stacks.c b/src/gc-stacks.c index 8515fb7797be6..998e763049164 100644 --- a/src/gc-stacks.c +++ b/src/gc-stacks.c @@ -101,6 +101,20 @@ JL_DLLEXPORT void jl_free_stack(void *stkbuf, size_t bufsz) } +void jl_release_task_stack(jl_ptls_t ptls, jl_task_t *task) +{ + void *stkbuf = task->stkbuf; + size_t bufsz = task->bufsz; + if (bufsz <= pool_sizes[JL_N_STACK_POOLS - 1]) { + unsigned pool_id = select_pool(bufsz); + if (pool_sizes[pool_id] == bufsz) { + task->stkbuf = NULL; + arraylist_push(&ptls->heap.free_stacks[pool_id], stkbuf); + } + } +} + + JL_DLLEXPORT void *jl_malloc_stack(size_t *bufsz, jl_task_t *owner) { jl_ptls_t ptls = jl_get_ptls_states(); diff --git a/src/task.c b/src/task.c index 75656b82d0da7..04d6157b06d0b 100644 --- a/src/task.c +++ b/src/task.c @@ -191,6 +191,8 @@ JL_DLLEXPORT void julia_init(JL_IMAGE_SEARCH rel) _julia_init(rel); } +void jl_release_task_stack(jl_ptls_t ptls, jl_task_t *task); + static void ctx_switch(jl_ptls_t ptls, jl_task_t **pt) { jl_task_t *t = *pt; @@ -223,10 +225,10 @@ static void ctx_switch(jl_ptls_t ptls, jl_task_t **pt) if (killed) { *pt = lastt; // can't fail after here: clear the gc-root for the target task now lastt->gcstack = NULL; - // if (!lastt->copy_stack) { // TODO: early free of stkbuf - // jl_free_stack(lastt->stkbuf, lastt->bufsz); - // lastt->stkbuf = NULL; - // } + if (!lastt->copy_stack && lastt->stkbuf) { + // early free of stkbuf back to the pool + jl_release_task_stack(ptls, lastt); + } } else { #ifdef COPY_STACKS