From 59aaf50bde2347f826259a1951a5af4bfca060e0 Mon Sep 17 00:00:00 2001 From: Brian Norris Date: Mon, 12 Mar 2012 16:06:14 -0700 Subject: [PATCH] move 'current thread' details The low level details regarding the 'current thread' should be encapsulated in the scheduler (i.e., 'get_current_thread()'). So we move the 'current' variable to scheduler.c. --- libthreads.c | 14 ++++++-------- schedule.c | 23 ++++++++++++++++------- schedule.h | 2 -- 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/libthreads.c b/libthreads.c index 3697c08..c164d67 100644 --- a/libthreads.c +++ b/libthreads.c @@ -10,7 +10,7 @@ #define STACK_SIZE (1024 * 1024) -static struct thread *current, *main_thread; +static struct thread *main_thread; static void *stack_allocate(size_t size) { @@ -62,10 +62,9 @@ int thread_yield(void) struct thread *old, *next; DBG(); - old = current; + old = thread_current(); model->scheduler->add_thread(old); next = model->scheduler->next_thread(); - current = next; DEBUG("(%d, %d)\n", old->index, next->index); return thread_swap(old, next); } @@ -79,15 +78,14 @@ static void thread_dispose(struct thread *t) static void thread_wait_finish(void) { - struct thread *next; + struct thread *curr, *next; DBG(); do { - if (current) - thread_dispose(current); + if ((curr = thread_current())) + thread_dispose(curr); next = model->scheduler->next_thread(); - current = next; } while (next && !thread_swap(main_thread, next)); } @@ -122,7 +120,7 @@ void thread_join(struct thread *t) struct thread *thread_current(void) { - return current; + return model->scheduler->get_current_thread(); } int main() diff --git a/schedule.c b/schedule.c index 4ac8b49..c8f54e8 100644 --- a/schedule.c +++ b/schedule.c @@ -15,6 +15,7 @@ struct thread_list_node { struct thread_list_node *head, *tail; struct thread_list_node nodes[NUM_LIST_NODES]; +struct thread *current; static void enqueue_thread(struct thread *t) { @@ -35,7 +36,7 @@ static void enqueue_thread(struct thread *t) tail = node; } -struct thread *dequeue_thread(void) +static struct thread *dequeue_thread(void) { struct thread *pop; @@ -48,30 +49,38 @@ struct thread *dequeue_thread(void) tail = NULL; head = head->next; + /* Set new current thread */ + current = pop; + return pop; } -void schedule_add_thread(struct thread *t) +static void default_add_thread(struct thread *t) { DEBUG("thread %d\n", t->index); enqueue_thread(t); } -struct thread *schedule_choose_next(void) +static struct thread *default_choose_next(void) { return dequeue_thread(); } +static struct thread *default_thread_current(void) +{ + return current; +} + void scheduler_init(struct model_checker *mod) { struct scheduler *sched; - /* Initialize FCFS scheduler */ + /* Initialize default scheduler */ sched = malloc(sizeof(*sched)); sched->init = NULL; sched->exit = NULL; - sched->add_thread = schedule_add_thread; - sched->next_thread = schedule_choose_next; - sched->get_current_thread = thread_current; + sched->add_thread = default_add_thread; + sched->next_thread = default_choose_next; + sched->get_current_thread = default_thread_current; mod->scheduler = sched; } diff --git a/schedule.h b/schedule.h index 360b390..bae8c1f 100644 --- a/schedule.h +++ b/schedule.h @@ -15,7 +15,5 @@ struct scheduler { }; void scheduler_init(struct model_checker *mod); -void schedule_add_thread(struct thread *t); -struct thread *schedule_choose_next(void); #endif /* __SCHEDULE_H__ */ -- 2.34.1