about summary refs log tree commit diff
diff options
context:
space:
mode:
authorGraydon Hoare <graydon@mozilla.com>2011-07-13 12:25:36 -0700
committerGraydon Hoare <graydon@mozilla.com>2011-07-13 12:25:36 -0700
commit01fc165517a404748a8050960f4c1606daac80b9 (patch)
treea6b0cc590e49f59f435c7cdc077c2aa8d2948448
parentece2d27205a7af7978d866b25cece95c786e24a0 (diff)
downloadrust-01fc165517a404748a8050960f4c1606daac80b9.tar.gz
rust-01fc165517a404748a8050960f4c1606daac80b9.zip
Attempt to correct buggy win32 timer code (causing tinderbox failures).
-rw-r--r--src/rt/rust_builtin.cpp2
-rw-r--r--src/rt/rust_scheduler.cpp5
-rw-r--r--src/rt/rust_task.cpp4
-rw-r--r--src/rt/rust_upcall.cpp4
-rw-r--r--src/rt/sync/timer.cpp43
-rw-r--r--src/rt/sync/timer.h18
-rw-r--r--src/rt/test/rust_test_harness.cpp2
7 files changed, 42 insertions, 36 deletions
diff --git a/src/rt/rust_builtin.cpp b/src/rt/rust_builtin.cpp
index 1caacd7a9d3..aa4b7473c67 100644
--- a/src/rt/rust_builtin.cpp
+++ b/src/rt/rust_builtin.cpp
@@ -673,7 +673,7 @@ get_time(rust_task *task, uint32_t *sec, uint32_t *usec) {
 extern "C" CDECL void
 nano_time(rust_task *task, uint64_t *ns) {
     timer t;
-    *ns = t.nano_time();
+    *ns = t.time_ns();
 }
 
 /**
diff --git a/src/rt/rust_scheduler.cpp b/src/rt/rust_scheduler.cpp
index 00368205de7..321d10bd811 100644
--- a/src/rt/rust_scheduler.cpp
+++ b/src/rt/rust_scheduler.cpp
@@ -148,10 +148,11 @@ rust_scheduler::log_state() {
     if (!running_tasks.is_empty()) {
         log(NULL, log_note, "running tasks:");
         for (size_t i = 0; i < running_tasks.length(); i++) {
-            log(NULL, log_note, "\t task: %s @0x%" PRIxPTR " timeout: %d",
+            log(NULL, log_note, "\t task: %s @0x%" PRIxPTR
+                " remaining: %" PRId64 " us",
                 running_tasks[i]->name,
                 running_tasks[i],
-                running_tasks[i]->yield_timer.get_timeout());
+                running_tasks[i]->yield_timer.remaining_us());
         }
     }
 
diff --git a/src/rt/rust_task.cpp b/src/rt/rust_task.cpp
index e0ae1ff367f..b8fa6bd72eb 100644
--- a/src/rt/rust_task.cpp
+++ b/src/rt/rust_task.cpp
@@ -162,7 +162,7 @@ rust_task::start(uintptr_t spawnee_fn,
 
     ctx.call((void *)task_start_wrapper, a, sp);
 
-    yield_timer.reset(0);
+    yield_timer.reset_us(0);
     transition(&sched->newborn_tasks, &sched->running_tasks);
 }
 
@@ -188,7 +188,7 @@ rust_task::yield(size_t nargs, size_t time_in_us) {
 
     // FIXME: what is nargs for, and is it safe to ignore?
 
-    yield_timer.reset(time_in_us);
+    yield_timer.reset_us(time_in_us);
 
     // Return to the scheduler.
     ctx.next->swap(ctx);
diff --git a/src/rt/rust_upcall.cpp b/src/rt/rust_upcall.cpp
index 9a55ce54425..ec3e1856ea4 100644
--- a/src/rt/rust_upcall.cpp
+++ b/src/rt/rust_upcall.cpp
@@ -170,8 +170,8 @@ upcall_yield(rust_task *task) {
 extern "C" CDECL void
 upcall_sleep(rust_task *task, size_t time_in_us) {
     LOG_UPCALL_ENTRY(task);
-    LOG(task, task, "elapsed %d",
-              task->yield_timer.get_elapsed_time());
+    LOG(task, task, "elapsed %" PRIu64 " us",
+              task->yield_timer.elapsed_us());
     LOG(task, task, "sleep %d us", time_in_us);
     task->yield(2, time_in_us);
 }
diff --git a/src/rt/sync/timer.cpp b/src/rt/sync/timer.cpp
index 3af441c3950..2c0f92a1cf6 100644
--- a/src/rt/sync/timer.cpp
+++ b/src/rt/sync/timer.cpp
@@ -5,43 +5,48 @@
 #include <mach/mach_time.h>
 #endif
 
+uint64_t ns_per_s = 1000000000LL;
+
 timer::timer() {
 #if __WIN32__
-    uint64_t ticks_per_second;
-    QueryPerformanceFrequency((LARGE_INTEGER *)&ticks_per_second);
-    _ticks_per_ns = ticks_per_second / 1000;
+    _ticks_per_s = 0LL;
+    // FIXME: assert this works or have a workaround.
+    QueryPerformanceFrequency((LARGE_INTEGER *)&_ticks_per_s);
+    if (_ticks_per_s == 0LL) {
+      _ticks_per_s = 1LL;
+    }
 #endif
-    reset(0);
+    reset_us(0);
 }
 
 void
-timer::reset(uint64_t timeout) {
-    _start = get_time();
-    _timeout = timeout;
+timer::reset_us(uint64_t timeout_us) {
+    _start_us = time_us();
+    _timeout_us = timeout_us;
 }
 
 uint64_t
-timer::get_elapsed_time() {
-    return get_time() - _start;
+timer::elapsed_us() {
+    return time_us() - _start_us;
 }
 
 double
-timer::get_elapsed_time_in_ms() {
-    return (double) get_elapsed_time() / 1000.0;
+timer::elapsed_ms() {
+    return (double) elapsed_us() / 1000.0;
 }
 
 int64_t
-timer::get_timeout() {
-    return _timeout - get_elapsed_time();
+timer::remaining_us() {
+    return _timeout_us - elapsed_us();
 }
 
 bool
 timer::has_timed_out() {
-    return get_timeout() <= 0;
+    return remaining_us() <= 0;
 }
 
 uint64_t
-timer::nano_time() {
+timer::time_ns() {
 #ifdef __APPLE__
     uint64_t time = mach_absolute_time();
     mach_timebase_info_data_t info = {0, 0};
@@ -53,17 +58,17 @@ timer::nano_time() {
 #elif __WIN32__
     uint64_t ticks;
     QueryPerformanceCounter((LARGE_INTEGER *)&ticks);
-    return ticks / _ticks_per_ns;
+    return ((ticks * ns_per_s) / _ticks_per_s);
 #else
     timespec ts;
     clock_gettime(CLOCK_MONOTONIC, &ts);
-    return (ts.tv_sec * 1000000000LL + ts.tv_nsec);
+    return (ts.tv_sec * ns_per_s + ts.tv_nsec);
 #endif
 }
 
 uint64_t
-timer::get_time() {
-    return nano_time() / 1000;
+timer::time_us() {
+    return time_ns() / 1000;
 }
 
 timer::~timer() {
diff --git a/src/rt/sync/timer.h b/src/rt/sync/timer.h
index 6d833396cf9..ac06b3445c3 100644
--- a/src/rt/sync/timer.h
+++ b/src/rt/sync/timer.h
@@ -7,20 +7,20 @@
 
 class timer {
 private:
-    uint64_t _start;
-    uint64_t _timeout;
-    uint64_t get_time();
+    uint64_t _start_us;
+    uint64_t _timeout_us;
+    uint64_t time_us();
 #if __WIN32__
-    uint64_t _ticks_per_ns;
+    uint64_t _ticks_per_s;
 #endif
 public:
     timer();
-    void reset(uint64_t timeout);
-    uint64_t get_elapsed_time();
-    double get_elapsed_time_in_ms();
-    int64_t get_timeout();
+    void reset_us(uint64_t timeout);
+    uint64_t elapsed_us();
+    double elapsed_ms();
+    int64_t remaining_us();
     bool has_timed_out();
-    uint64_t nano_time();
+    uint64_t time_ns();
     virtual ~timer();
 };
 
diff --git a/src/rt/test/rust_test_harness.cpp b/src/rt/test/rust_test_harness.cpp
index cca199dcdb9..ec89da1ff92 100644
--- a/src/rt/test/rust_test_harness.cpp
+++ b/src/rt/test/rust_test_harness.cpp
@@ -30,7 +30,7 @@ rust_test_suite::run() {
         timer timer;
         bool result = tests[i]->run();
         printf("test: %s %s %.2f ms\n", test->name(),
-               result ? "PASSED" : "FAILE", timer.get_elapsed_time_in_ms());
+               result ? "PASS" : "FAIL", timer.elapsed_ms());
         if (result == false) {
             pass = false;
         }