X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=solutions%2Fp1.patch;h=3c8c2aceb50c53b614f4bf9bd24043228294b3b7;hb=5f9cda0d4a96e76b399143fcaf41dd8f7d609187;hp=ce21107889227b3c51d0290c40da6f81a8416421;hpb=c7ceee91c04fa72da655c00cb82302537ff6c9eb;p=pintos-anon diff --git a/solutions/p1.patch b/solutions/p1.patch index ce21107..3c8c2ac 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; @@ -20,7 +21,7 @@ diff -u src/devices/timer.c~ src/devices/timer.c } /* Calibrates loops_per_tick, used to implement brief delays. */ -@@ -87,15 +92,36 @@ timer_elapsed (int64_t then) +@@ -93,16 +93,37 @@ return timer_ticks () - then; } @@ -36,7 +37,8 @@ diff -u src/devices/timer.c~ src/devices/timer.c + return a->wakeup_time < b->wakeup_time; +} + - /* Suspends execution for approximately TICKS timer ticks. */ + /* Sleeps for approximately TICKS timer ticks. Interrupts must + be turned on. */ void timer_sleep (int64_t ticks) { @@ -59,8 +61,8 @@ diff -u src/devices/timer.c~ src/devices/timer.c + sema_down (&t->timer_sema); } - /* Suspends execution for approximately MS milliseconds. */ -@@ -132,6 +158,16 @@ timer_interrupt (struct intr_frame *args + /* Sleeps for approximately MS milliseconds. Interrupts must be +@@ -132,6 +158,17 @@ timer_interrupt (struct intr_frame *args { ticks++; thread_tick (); @@ -72,14 +74,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 +205,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 +359,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 @@ -364,11 +370,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 @@ -413,7 +419,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 +457,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 +482,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 +553,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 +563,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 +632,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 +661,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 +701,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 +736,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