From 3d1e18466b44b2de06dd7c00a85e78ed9340906d Mon Sep 17 00:00:00 2001 From: manuel Date: Thu, 3 May 2012 16:18:11 +0200 Subject: initial commit of proj1 including the draft of our (yet empty) design document and the first schedule code mostly submitted by karo and peter --- threads/thread.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) (limited to 'threads/thread.c') diff --git a/threads/thread.c b/threads/thread.c index 845f059..3fefbd8 100644 --- a/threads/thread.c +++ b/threads/thread.c @@ -71,6 +71,16 @@ static void schedule (void); void thread_schedule_tail (struct thread *prev); static tid_t allocate_tid (void); +//TODO: should take donated priority into account +static bool +ready_list_cmp_less(const struct list_elem *a, const struct list_elem *b, + void *AUX UNUSED) +{ + struct thread *t1 = list_entry (a, struct thread, elem); + struct thread *t2 = list_entry (b, struct thread, elem); + return (t1->priority > t2->priority); +} + /* Initializes the threading system by transforming the code that's currently running into a thread. This can't work in general and it is possible in this case only because loader.S @@ -212,6 +222,7 @@ thread_create (const char *name, int priority, /* Add to run queue. */ thread_unblock (t); + thread_yield (); return tid; } @@ -249,7 +260,8 @@ thread_unblock (struct thread *t) old_level = intr_disable (); ASSERT (t->status == THREAD_BLOCKED); - list_push_back (&ready_list, &t->elem); + /* add thread to our ordered ready_list */ + list_insert_ordered (&ready_list, &t->elem, &ready_list_cmp_less, NULL); t->status = THREAD_READY; intr_set_level (old_level); } @@ -320,7 +332,7 @@ thread_yield (void) old_level = intr_disable (); if (cur != idle_thread) - list_push_back (&ready_list, &cur->elem); + list_insert_ordered (&ready_list, &cur->elem, &ready_list_cmp_less, NULL); cur->status = THREAD_READY; schedule (); intr_set_level (old_level); @@ -348,6 +360,14 @@ void thread_set_priority (int new_priority) { thread_current ()->priority = new_priority; + + /* compare priority with the highest priority in the list */ + if (!list_empty (&ready_list)) + { + struct thread *t = list_entry (list_front (&ready_list), struct thread, elem); + if (t->priority > thread_current ()->priority) + thread_yield(); + } } /* Returns the current thread's priority. */ -- cgit v1.2.3