X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=solutions%2Fp1.patch;h=a3079163a4f1c1f336061f980eacc968b656df57;hb=0147215f6360d42fad81ce164b661054f572ac15;hp=213e05ef29e2f749ab24ad6f5a38e02b7d0ca630;hpb=4ebf33908a571a7cde93fe618902b044e3633cdf;p=pintos-anon diff --git a/solutions/p1.patch b/solutions/p1.patch index 213e05e..a307916 100644 --- a/solutions/p1.patch +++ b/solutions/p1.patch @@ -1,6 +1,7 @@ +Index: src/devices/timer.c diff -u src/devices/timer.c~ src/devices/timer.c ---- src/devices/timer.c~ 2005-05-24 15:52:43.000000000 -0700 -+++ src/devices/timer.c 2005-05-26 15:19:20.000000000 -0700 +--- src/devices/timer.c~ ++++ src/devices/timer.c @@ -23,6 +23,9 @@ static volatile int64_t ticks; Initialized by timer_calibrate(). */ static unsigned loops_per_tick; @@ -60,7 +61,7 @@ diff -u src/devices/timer.c~ src/devices/timer.c } /* Suspends execution for approximately MS milliseconds. */ -@@ -132,6 +158,16 @@ timer_interrupt (struct intr_frame *args +@@ -132,6 +158,17 @@ timer_interrupt (struct intr_frame *args { ticks++; thread_tick (); @@ -72,14 +73,16 @@ diff -u src/devices/timer.c~ src/devices/timer.c + if (ticks < t->wakeup_time) + break; + sema_up (&t->timer_sema); ++ thread_yield_to_higher_priority (); + list_pop_front (&wait_list); + } } /* Returns true if LOOPS iterations waits for more than one timer +Index: src/threads/fixed-point.h diff -u src/threads/fixed-point.h~ src/threads/fixed-point.h ---- src/threads/fixed-point.h~ 1969-12-31 16:00:00.000000000 -0800 -+++ src/threads/fixed-point.h 2005-06-02 14:11:21.000000000 -0700 +--- src/threads/fixed-point.h~ ++++ src/threads/fixed-point.h @@ -0,0 +1,120 @@ +#ifndef THREADS_FIXED_POINT_H +#define THREADS_FIXED_POINT_H @@ -201,9 +204,10 @@ diff -u src/threads/fixed-point.h~ src/threads/fixed-point.h +} + +#endif /* threads/fixed-point.h */ +Index: src/threads/synch.c diff -u src/threads/synch.c~ src/threads/synch.c ---- src/threads/synch.c~ 2005-05-24 20:47:28.000000000 -0700 -+++ src/threads/synch.c 2005-06-02 14:20:15.000000000 -0700 +--- src/threads/synch.c~ ++++ src/threads/synch.c @@ -114,10 +114,28 @@ sema_up (struct semaphore *sema) ASSERT (sema != NULL); @@ -236,10 +240,16 @@ diff -u src/threads/synch.c~ src/threads/synch.c intr_set_level (old_level); } -@@ -200,6 +218,23 @@ lock_acquire (struct lock *lock) +@@ -200,8 +218,29 @@ lock_acquire (struct lock *lock) + lock_acquire (struct lock *lock) + { ++ enum intr_level old_level; ++ + ASSERT (lock != NULL); + ASSERT (!intr_context ()); ASSERT (!lock_held_by_current_thread (lock)); - old_level = intr_disable (); ++ old_level = intr_disable (); + + if (lock->holder != NULL) + { @@ -259,18 +269,18 @@ diff -u src/threads/synch.c~ src/threads/synch.c + sema_down (&lock->semaphore); lock->holder = thread_current (); - intr_set_level (old_level); -@@ -238,13 +273,37 @@ void ++ intr_set_level (old_level); +@@ -238,9 +273,37 @@ void lock_release (struct lock *lock) { - enum intr_level old_level; ++ enum intr_level old_level; + struct thread *t = thread_current (); + struct list_elem *e; - ++ ASSERT (lock != NULL); ASSERT (lock_held_by_current_thread (lock)); - old_level = intr_disable (); ++ old_level = intr_disable (); + + /* Return donations to threads that want this lock. */ + for (e = list_begin (&t->donors); e != list_end (&t->donors); ) @@ -295,7 +305,7 @@ diff -u src/threads/synch.c~ src/threads/synch.c + thread_recompute_priority (t); + thread_yield_to_higher_priority (); + - intr_set_level (old_level); ++ intr_set_level (old_level); } @@ -264,6 +323,7 @@ struct semaphore_elem @@ -327,7 +337,7 @@ diff -u src/threads/synch.c~ src/threads/synch.c + const struct semaphore_elem *b + = list_entry (b_, struct semaphore_elem, elem); + -+ return a->thread->priority > b->thread->priority; ++ return a->thread->priority < b->thread->priority; +} + /* If any threads are waiting on COND (protected by LOCK), then @@ -348,9 +358,10 @@ diff -u src/threads/synch.c~ src/threads/synch.c } /* Wakes up all threads, if any, waiting on COND (protected by +Index: src/threads/thread.c diff -u src/threads/thread.c~ src/threads/thread.c ---- src/threads/thread.c~ 2005-06-02 14:35:12.000000000 -0700 -+++ src/threads/thread.c 2005-06-02 14:55:56.000000000 -0700 +--- src/threads/thread.c~ ++++ src/threads/thread.c @@ -5,12 +5,14 @@ #include #include @@ -358,11 +369,11 @@ diff -u src/threads/thread.c~ src/threads/thread.c +#include "threads/init.h" #include "threads/interrupt.h" #include "threads/intr-stubs.h" - #include "threads/mmu.h" #include "threads/palloc.h" #include "threads/switch.h" #include "threads/synch.h" +#include "devices/timer.h" + #include "threads/vaddr.h" #ifdef USERPROG #include "userprog/process.h" #endif @@ -407,7 +418,7 @@ diff -u src/threads/thread.c~ src/threads/thread.c - /* Enforce preemption. */ - if (++thread_ticks >= TIME_SLICE) - intr_yield_on_return (); -+ if (enable_mlfqs) ++ if (thread_mlfqs) + { + /* Update load average. */ + if (timer_ticks () % TIMER_FREQ == 0) @@ -445,7 +456,7 @@ diff -u src/threads/thread.c~ src/threads/thread.c + /* Switch threads if time slice has expired. */ + if (++thread_ticks >= TIME_SLICE) + { -+ if (enable_mlfqs) ++ if (thread_mlfqs) + thread_recompute_priority (thread_current ()); + intr_yield_on_return (); + } @@ -470,7 +481,7 @@ diff -u src/threads/thread.c~ src/threads/thread.c /* Initialize thread. */ - init_thread (t, name, priority); -+ init_thread (t, name, enable_mlfqs ? cur->priority : priority); ++ init_thread (t, name, thread_mlfqs ? cur->priority : priority); tid = t->tid = allocate_tid (); + t->nice = cur->nice; + t->recent_cpu = cur->recent_cpu; @@ -488,7 +499,7 @@ diff -u src/threads/thread.c~ src/threads/thread.c + /* Add to run queue. */ thread_unblock (t); -+ if (priority < thread_get_priority ()) ++ if (priority > thread_get_priority ()) + thread_yield (); return tid; @@ -507,7 +518,7 @@ diff -u src/threads/thread.c~ src/threads/thread.c + const struct thread *a = list_entry (a_, struct thread, elem); + const struct thread *b = list_entry (b_, struct thread, elem); + -+ return a->priority > b->priority; ++ return a->priority < b->priority; +} + /* Transitions a blocked thread T to the ready-to-run state. @@ -541,7 +552,7 @@ diff -u src/threads/thread.c~ src/threads/thread.c +thread_set_priority (int priority) { - thread_current ()->priority = new_priority; -+ if (!enable_mlfqs) ++ if (!thread_mlfqs) + { + struct thread *t = thread_current (); + @@ -551,7 +562,7 @@ diff -u src/threads/thread.c~ src/threads/thread.c } /* Returns the current thread's priority. */ -@@ -298,33 +386,93 @@ thread_get_priority (void) +@@ -298,33 +386,98 @@ thread_get_priority (void) /* Sets the current thread's nice value to NICE. */ void @@ -608,7 +619,7 @@ diff -u src/threads/thread.c~ src/threads/thread.c + const struct thread *a = list_entry (a_, struct thread, donor_elem); + const struct thread *b = list_entry (b_, struct thread, donor_elem); + -+ return a->priority > b->priority; ++ return a->priority < b->priority; +} + +/* Recomputes T's priority in terms of its normal priority and @@ -619,10 +630,10 @@ diff -u src/threads/thread.c~ src/threads/thread.c +{ + int old_priority = t->priority; + int default_priority = t->normal_priority; -+ int donation = PRI_MAX; -+ if (enable_mlfqs) ++ int donation = PRI_MIN; ++ if (thread_mlfqs) + { -+ default_priority = fix_round (t->recent_cpu) / 4 + t->nice * 2; ++ default_priority = PRI_MAX - fix_round (t->recent_cpu) / 4 - t->nice * 2; + if (default_priority < PRI_MIN) + default_priority = PRI_MIN; + else if (default_priority > PRI_MAX) @@ -631,8 +642,8 @@ diff -u src/threads/thread.c~ src/threads/thread.c + if (!list_empty (&t->donors)) + donation = list_entry (list_max (&t->donors, donated_lower_priority, NULL), + struct thread, donor_elem)->priority; -+ t->priority = donation < default_priority ? donation : default_priority; -+ if (t->priority < old_priority && t->donee != NULL) ++ t->priority = donation > default_priority ? donation : default_priority; ++ if (t->priority > old_priority && t->donee != NULL) + thread_recompute_priority (t->donee); +} + @@ -648,8 +659,13 @@ diff -u src/threads/thread.c~ src/threads/thread.c + struct thread *max = list_entry (list_max (&ready_list, + thread_lower_priority, NULL), + struct thread, elem); -+ if (max->priority < cur->priority) -+ thread_yield (); ++ if (max->priority > cur->priority) ++ { ++ if (intr_context ()) ++ intr_yield_on_return (); ++ else ++ thread_yield (); ++ } + } + intr_set_level (old_level); } @@ -684,9 +700,10 @@ diff -u src/threads/thread.c~ src/threads/thread.c } /* Completes a thread switch by activating the new thread's page +Index: src/threads/thread.h diff -u src/threads/thread.h~ src/threads/thread.h ---- src/threads/thread.h~ 2005-06-02 14:32:36.000000000 -0700 -+++ src/threads/thread.h 2005-06-02 14:38:46.000000000 -0700 +--- src/threads/thread.h~ ++++ src/threads/thread.h @@ -4,6 +4,8 @@ #include #include @@ -718,7 +735,7 @@ diff -u src/threads/thread.h~ src/threads/thread.h + /* Alarm clock. */ + int64_t wakeup_time; /* Time to wake this thread up. */ -+ struct list_elem timer_elem; /* Element in timer_wait_list. */ ++ struct list_elem timer_elem; /* Element in wait_list. */ + struct semaphore timer_sema; /* Semaphore. */ + #ifdef USERPROG