X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=solutions%2Fp1.patch;h=3c8c2aceb50c53b614f4bf9bd24043228294b3b7;hb=5f9cda0d4a96e76b399143fcaf41dd8f7d609187;hp=ae8f15b9fec458b0b01e3cc47d13d7532c56237c;hpb=71b4d5a453498d45ae5929b51247a487c0e3719d;p=pintos-anon diff --git a/solutions/p1.patch b/solutions/p1.patch index ae8f15b..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); @@ -333,7 +338,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 @@ -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; @@ -494,7 +500,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; @@ -513,7 +519,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. @@ -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 @@ -614,7 +620,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 @@ -625,10 +631,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) @@ -637,8 +643,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); +} + @@ -654,8 +660,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); } @@ -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