From 2607976d11f1f39a19fc11f3fa365c848fec1979 Mon Sep 17 00:00:00 2001 From: Brian Norris Date: Fri, 9 Mar 2012 17:08:21 -0800 Subject: [PATCH] libthreads: cleanup startup/exit functions Free the stacks Push thread exit management into thread_wait_finish() function --- libthreads.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/libthreads.c b/libthreads.c index 15c6b949..05440c04 100644 --- a/libthreads.c +++ b/libthreads.c @@ -12,6 +12,11 @@ static void *stack_allocate(size_t size) return malloc(size); } +static void stack_free(void *stack) +{ + free(stack); +} + static int create_context(struct thread *t) { int ret; @@ -63,22 +68,25 @@ static int thread_yield() return thread_swap(old, next); } -static int master_thread_yield() +static void thread_dispose(struct thread *t) +{ + DEBUG("completed thread %d\n", current->index); + t->completed = 1; + stack_free(t->stack); +} + +static void thread_wait_finish() { struct thread *next; DBG(); - if (current) { - DEBUG("completed thread %d\n", current->index); - current->completed = 1; - } - schedule_choose_next(&next); - if (next && !next->completed) { + do { + if (current) + thread_dispose(current); + schedule_choose_next(&next); current = next; - return thread_swap(main_thread, next); - } - return 1; + } while (next && !thread_swap(main_thread, next)); } int thread_create(struct thread *t, void (*start_routine), void *arg) @@ -142,10 +150,11 @@ int main() main_thread = malloc(sizeof(struct thread)); create_initial_thread(main_thread); + /* Start user program */ thread_create(&user_thread, &user_main, NULL); /* Wait for all threads to complete */ - while (master_thread_yield() == 0); + thread_wait_finish(); DEBUG("Exiting\n"); return 0; -- 2.34.1