about summary refs log tree commit diff
path: root/src/rt/rust_timer.cpp
diff options
context:
space:
mode:
authorGraydon Hoare <graydon@mozilla.com>2010-07-04 21:18:47 -0700
committerGraydon Hoare <graydon@mozilla.com>2010-07-04 21:18:47 -0700
commit2a413070c66911e9a5211d271c704d4c7f03b49a (patch)
treec05df70525584534cb772f6661a9fd53d8773c99 /src/rt/rust_timer.cpp
parentf2861448ab16ae06ffdc8560e9f50d6c192c0623 (diff)
downloadrust-2a413070c66911e9a5211d271c704d4c7f03b49a.tar.gz
rust-2a413070c66911e9a5211d271c704d4c7f03b49a.zip
Preempt works on non-windows, just needed a little valgrind love to complete in a reasonable time.
Diffstat (limited to 'src/rt/rust_timer.cpp')
-rw-r--r--src/rt/rust_timer.cpp12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/rt/rust_timer.cpp b/src/rt/rust_timer.cpp
index 7950c02196a..997fbb51260 100644
--- a/src/rt/rust_timer.cpp
+++ b/src/rt/rust_timer.cpp
@@ -1,5 +1,6 @@
 
 #include "rust_internal.h"
+#include "valgrind.h"
 
 // The mechanism in this file is very crude; every domain (thread) spawns its
 // own secondary timer thread, and that timer thread *never idles*. It
@@ -32,11 +33,15 @@ timer_loop(void *ptr)
     rust_timer *timer = (rust_timer *)ptr;
     rust_dom &dom = timer->dom;
     dom.log(rust_log::TIMER, "in timer 0x%" PRIxPTR, (uintptr_t)timer);
+    size_t ms = TIME_SLICE_IN_MS;
+    if (!RUNNING_ON_VALGRIND)
+        ms = 1;
+
     while (!timer->exit_flag) {
 #if defined(__WIN32__)
-        Sleep(TIME_SLICE_IN_MS);
+        Sleep(ms);
 #else
-        usleep(TIME_SLICE_IN_MS * 1000);
+        usleep(ms * 1000);
 #endif
         dom.log(rust_log::TIMER,
                 "timer 0x%" PRIxPTR
@@ -65,6 +70,9 @@ rust_timer::rust_timer(rust_dom &dom) : dom(dom), exit_flag(0)
     pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
     pthread_create(&thread, &attr, timer_loop, (void *)this);
 #endif
+    if (RUNNING_ON_VALGRIND) {
+        usleep(10000);
+    }
 }
 
 rust_timer::~rust_timer()