X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=solutions%2Fp1.patch;h=a3079163a4f1c1f336061f980eacc968b656df57;hb=c809e9ba0a0dd653f20809d665ee7deb27aaac12;hp=fbfb405b09a090df9889f5b279c6947c1a43756c;hpb=a85e535e696138054a7b461ea8072f0d76c5b668;p=pintos-anon diff --git a/solutions/p1.patch b/solutions/p1.patch index fbfb405..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); @@ -354,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 @@ -413,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) @@ -451,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 (); + } @@ -476,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; @@ -547,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 (); + @@ -557,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 @@ -626,7 +631,7 @@ diff -u src/threads/thread.c~ src/threads/thread.c + int old_priority = t->priority; + int default_priority = t->normal_priority; + int donation = PRI_MIN; -+ if (enable_mlfqs) ++ if (thread_mlfqs) + { + default_priority = PRI_MAX - fix_round (t->recent_cpu) / 4 - t->nice * 2; + if (default_priority < PRI_MIN) @@ -655,7 +660,12 @@ diff -u src/threads/thread.c~ src/threads/thread.c + thread_lower_priority, NULL), + struct thread, elem); + if (max->priority > cur->priority) -+ thread_yield (); ++ { ++ if (intr_context ()) ++ intr_yield_on_return (); ++ else ++ thread_yield (); ++ } + } + intr_set_level (old_level); } @@ -690,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 @@ -724,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