make loop counter volatile to prevent gcc4.1 from optimizing away entire loop body
[pintos-anon] / src / devices / timer.c
index 9e1b4989c833b62cfcaa5a66032c1cae1124fec0..070c487328a61e10a8e6a86390703f4dd289173b 100644 (file)
@@ -16,9 +16,6 @@
 #error TIMER_FREQ <= 1000 recommended
 #endif
 
-/* Number of time ticks to elapse between process yields. */
-#define TIME_SLICE 1
-
 /* Number of timer ticks since OS booted. */
 static volatile int64_t ticks;
 
@@ -45,7 +42,7 @@ timer_init (void)
   outb (0x40, count & 0xff);
   outb (0x40, count >> 8);
 
-  intr_register (0x20, 0, INTR_OFF, timer_interrupt, "8254 Timer");
+  intr_register_ext (0x20, timer_interrupt, "8254 Timer");
 }
 
 /* Calibrates loops_per_tick, used to implement brief delays. */
@@ -126,7 +123,7 @@ timer_nsleep (int64_t ns)
 void
 timer_print_stats (void) 
 {
-  printf ("Timer: %"PRId64" ticks\n", ticks);
+  printf ("Timer: %"PRId64" ticks\n", timer_ticks ());
 }
 \f
 /* Timer interrupt handler. */
@@ -135,8 +132,6 @@ timer_interrupt (struct intr_frame *args UNUSED)
 {
   ticks++;
   thread_tick ();
-  if (ticks % TIME_SLICE == 0)
-    intr_yield_on_return ();
 }
 
 /* Returns true if LOOPS iterations waits for more than one timer
@@ -167,7 +162,7 @@ too_many_loops (unsigned loops)
    differently in different places the results would be difficult
    to predict. */
 static void NO_INLINE
-busy_wait (int64_t loops) 
+busy_wait (volatile int64_t loops) 
 {
   while (loops-- > 0)
     continue;