projects
/
pintos-anon
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Drop use of volatile in favor of explicit memory barriers.
[pintos-anon]
/
src
/
devices
/
timer.c
diff --git
a/src/devices/timer.c
b/src/devices/timer.c
index 24eede0e247e8c1f389be38f129dda96d81ffb80..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;
}
@@
-123,7
+128,7
@@
timer_nsleep (int64_t ns)
void
timer_print_stats (void)
{
void
timer_print_stats (void)
{
- printf ("Timer: %"PRId64" ticks\n", ti
cks
);
+ printf ("Timer: %"PRId64" ticks\n", ti
mer_ticks ()
);
}
\f
/* Timer interrupt handler. */
}
\f
/* Timer interrupt handler. */
@@
-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;
}
@@
-165,7
+169,7
@@
static void NO_INLINE
busy_wait (int64_t loops)
{
while (loops-- > 0)
busy_wait (int64_t loops)
{
while (loops-- > 0)
-
continue
;
+
barrier ()
;
}
/* Sleep for approximately NUM/DENOM seconds. */
}
/* Sleep for approximately NUM/DENOM seconds. */