projects
/
pintos-anon
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Improve wording.
[pintos-anon]
/
src
/
devices
/
timer.c
diff --git
a/src/devices/timer.c
b/src/devices/timer.c
index 070c487328a61e10a8e6a86390703f4dd289173b..a4521de86e32b91b7a939f68e06d6f6c7a0b83b3 100644
(file)
--- a/
src/devices/timer.c
+++ b/
src/devices/timer.c
@@
-5,6
+5,7
@@
#include <stdio.h>
#include "threads/interrupt.h"
#include "threads/io.h"
#include <stdio.h>
#include "threads/interrupt.h"
#include "threads/io.h"
+#include "threads/synch.h"
#include "threads/thread.h"
/* See [8254] for hardware details of the 8254 timer chip. */
#include "threads/thread.h"
/* See [8254] for hardware details of the 8254 timer chip. */
@@
-17,7
+18,7
@@
#endif
/* Number of timer ticks since OS booted. */
#endif
/* Number of timer ticks since OS booted. */
-static
volatile
int64_t ticks;
+static int64_t ticks;
/* Number of loops per timer tick.
Initialized by timer_calibrate(). */
/* Number of loops per timer tick.
Initialized by timer_calibrate(). */
@@
-57,8
+58,11
@@
timer_calibrate (void)
/* Approximate loops_per_tick as the largest power-of-two
still less than one timer tick. */
loops_per_tick = 1u << 10;
/* Approximate loops_per_tick as the largest power-of-two
still less than one timer tick. */
loops_per_tick = 1u << 10;
- while (!too_many_loops (loops_per_tick << 1))
- loops_per_tick <<= 1;
+ while (!too_many_loops (loops_per_tick << 1))
+ {
+ loops_per_tick <<= 1;
+ ASSERT (loops_per_tick != 0);
+ }
/* Refine the next 8 bits of loops_per_tick. */
high_bit = loops_per_tick;
/* Refine the next 8 bits of loops_per_tick. */
high_bit = loops_per_tick;
@@
-76,6
+80,7
@@
timer_ticks (void)
enum intr_level old_level = intr_disable ();
int64_t t = ticks;
intr_set_level (old_level);
enum intr_level old_level = intr_disable ();
int64_t t = ticks;
intr_set_level (old_level);
+ barrier ();
return t;
}
return t;
}
@@
-139,18
+144,17
@@
timer_interrupt (struct intr_frame *args UNUSED)
static bool
too_many_loops (unsigned loops)
{
static bool
too_many_loops (unsigned loops)
{
- int64_t start;
-
/* Wait for a timer tick. */
/* Wait for a timer tick. */
- start = ticks;
+
int64_t
start = ticks;
while (ticks == start)
while (ticks == start)
-
continue
;
+
barrier ()
;
/* Run LOOPS loops. */
start = ticks;
busy_wait (loops);
/* If the tick count changed, we iterated too long. */
/* Run LOOPS loops. */
start = ticks;
busy_wait (loops);
/* If the tick count changed, we iterated too long. */
+ barrier ();
return start != ticks;
}
return start != ticks;
}
@@
-162,10
+166,10
@@
too_many_loops (unsigned loops)
differently in different places the results would be difficult
to predict. */
static void NO_INLINE
differently in different places the results would be difficult
to predict. */
static void NO_INLINE
-busy_wait (
volatile
int64_t loops)
+busy_wait (int64_t loops)
{
while (loops-- > 0)
{
while (loops-- > 0)
-
continue
;
+
barrier ()
;
}
/* Sleep for approximately NUM/DENOM seconds. */
}
/* Sleep for approximately NUM/DENOM seconds. */