about summary refs log tree commit diff
diff options
context:
space:
mode:
authorChris Peterson <cpeterson@mozilla.com>2013-02-14 00:48:40 -0800
committerChris Peterson <cpeterson@mozilla.com>2013-02-14 22:31:08 -0800
commit665e900edeb611a7bfc9b0b911489cb802740945 (patch)
tree9e2361cdcbd298e2f608280cd278df73c6b38637
parentf4320b6195d2704cf5cb5cb7d23f2b6077a0b34c (diff)
downloadrust-665e900edeb611a7bfc9b0b911489cb802740945.tar.gz
rust-665e900edeb611a7bfc9b0b911489cb802740945.zip
encapsulate isaac RNG in rust_rng struct
-rw-r--r--src/libcore/rand.rs20
-rw-r--r--src/rt/rust_builtin.cpp28
-rw-r--r--src/rt/rust_rng.cpp16
-rw-r--r--src/rt/rust_rng.h9
-rw-r--r--src/rt/rust_sched_loop.cpp4
-rw-r--r--src/rt/rust_sched_loop.h3
6 files changed, 47 insertions, 33 deletions
diff --git a/src/libcore/rand.rs b/src/libcore/rand.rs
index 47a0e11941c..db7021f189a 100644
--- a/src/libcore/rand.rs
+++ b/src/libcore/rand.rs
@@ -116,15 +116,15 @@ impl<T: Rand> Rand for Option<T> {
 }
 
 #[allow(non_camel_case_types)] // runtime type
-enum rctx {}
+enum rust_rng {}
 
 #[abi = "cdecl"]
 extern mod rustrt {
     unsafe fn rand_seed() -> ~[u8];
-    unsafe fn rand_new() -> *rctx;
-    unsafe fn rand_new_seeded2(&&seed: ~[u8]) -> *rctx;
-    unsafe fn rand_next(c: *rctx) -> u32;
-    unsafe fn rand_free(c: *rctx);
+    unsafe fn rand_new() -> *rust_rng;
+    unsafe fn rand_new_seeded2(&&seed: ~[u8]) -> *rust_rng;
+    unsafe fn rand_next(rng: *rust_rng) -> u32;
+    unsafe fn rand_free(rng: *rust_rng);
 }
 
 /// A random number generator
@@ -363,24 +363,24 @@ impl Rng {
 }
 
 struct RandRes {
-    c: *rctx,
+    rng: *rust_rng,
     drop {
         unsafe {
-            rustrt::rand_free(self.c);
+            rustrt::rand_free(self.rng);
         }
     }
 }
 
-fn RandRes(c: *rctx) -> RandRes {
+fn RandRes(rng: *rust_rng) -> RandRes {
     RandRes {
-        c: c
+        rng: rng
     }
 }
 
 impl Rng for @RandRes {
     fn next() -> u32 {
         unsafe {
-            return rustrt::rand_next((*self).c);
+            return rustrt::rand_next((*self).rng);
         }
     }
 }
diff --git a/src/rt/rust_builtin.cpp b/src/rt/rust_builtin.cpp
index 63e24f37f24..a63348a2924 100644
--- a/src/rt/rust_builtin.cpp
+++ b/src/rt/rust_builtin.cpp
@@ -135,7 +135,7 @@ rand_seed() {
     rust_vec *v = (rust_vec *) task->kernel->malloc(vec_size<uint8_t>(size),
                                             "rand_seed");
     v->fill = v->alloc = size;
-    isaac_seed(task->kernel, (uint8_t*) &v->data, size);
+    rng_gen_seed(task->kernel, (uint8_t*) &v->data, size);
     return v;
 }
 
@@ -143,27 +143,27 @@ extern "C" CDECL void *
 rand_new() {
     rust_task *task = rust_get_current_task();
     rust_sched_loop *thread = task->sched_loop;
-    randctx *rctx = (randctx *) task->malloc(sizeof(randctx), "rand_new");
-    if (!rctx) {
+    rust_rng *rng = (rust_rng *) task->malloc(sizeof(rust_rng), "rand_new");
+    if (!rng) {
         task->fail();
         return NULL;
     }
-    isaac_init(thread->kernel, rctx, NULL);
-    return rctx;
+    rng_init(thread->kernel, rng, NULL);
+    return rng;
 }
 
 extern "C" CDECL void *
 rand_new_seeded(rust_vec_box* seed) {
     rust_task *task = rust_get_current_task();
     rust_sched_loop *thread = task->sched_loop;
-    randctx *rctx = (randctx *) task->malloc(sizeof(randctx),
-                                             "rand_new_seeded");
-    if (!rctx) {
+    rust_rng *rng = (rust_rng *) task->malloc(sizeof(rust_rng),
+                                              "rand_new_seeded");
+    if (!rng) {
         task->fail();
         return NULL;
     }
-    isaac_init(thread->kernel, rctx, seed);
-    return rctx;
+    rng_init(thread->kernel, rng, seed);
+    return rng;
 }
 
 extern "C" CDECL void *
@@ -172,14 +172,14 @@ rand_new_seeded2(rust_vec_box** seed) {
 }
 
 extern "C" CDECL uint32_t
-rand_next(randctx *rctx) {
-    return isaac_rand(rctx);
+rand_next(rust_rng *rng) {
+    return rng_gen_u32(rng);
 }
 
 extern "C" CDECL void
-rand_free(randctx *rctx) {
+rand_free(rust_rng *rng) {
     rust_task *task = rust_get_current_task();
-    task->free(rctx);
+    task->free(rng);
 }
 
 
diff --git a/src/rt/rust_rng.cpp b/src/rt/rust_rng.cpp
index 5f4522c4978..3d1e52cb993 100644
--- a/src/rt/rust_rng.cpp
+++ b/src/rt/rust_rng.cpp
@@ -15,7 +15,7 @@
 // Initialization helpers for ISAAC RNG
 
 void
-isaac_seed(rust_kernel* kernel, uint8_t* dest, size_t size) {
+rng_gen_seed(rust_kernel* kernel, uint8_t* dest, size_t size) {
 #ifdef __WIN32__
     HCRYPTPROV hProv;
     kernel->win32_require
@@ -47,7 +47,7 @@ isaac_seed(rust_kernel* kernel, uint8_t* dest, size_t size) {
 #endif
 }
 
-void
+static void
 isaac_init(rust_kernel *kernel, randctx *rctx, rust_vec_box* user_seed) {
     memset(rctx, 0, sizeof(randctx));
 
@@ -64,12 +64,22 @@ isaac_init(rust_kernel *kernel, randctx *rctx, rust_vec_box* user_seed) {
             seed = (seed + 0x7ed55d16) + (seed << 12);
         }
     } else {
-        isaac_seed(kernel, (uint8_t*) &rctx->randrsl, sizeof(rctx->randrsl));
+        rng_gen_seed(kernel, (uint8_t*)&rctx->randrsl, sizeof(rctx->randrsl));
     }
 
     randinit(rctx, 1);
 }
 
+void
+rng_init(rust_kernel* kernel, rust_rng* rng, rust_vec_box* user_seed) {
+    isaac_init(kernel, &rng->rctx, user_seed);
+}
+
+uint32_t
+rng_gen_u32(rust_rng* rng) {
+    return isaac_rand(&rng->rctx);
+}
+
 //
 // Local Variables:
 // mode: C++
diff --git a/src/rt/rust_rng.h b/src/rt/rust_rng.h
index 7f61b615b25..7cdd918df6e 100644
--- a/src/rt/rust_rng.h
+++ b/src/rt/rust_rng.h
@@ -18,8 +18,13 @@ struct rust_vec_box;
 
 // Initialization helpers for ISAAC RNG
 
-void isaac_seed(rust_kernel* kernel, uint8_t* dest, size_t size);
-void isaac_init(rust_kernel *kernel, randctx *rctx, rust_vec_box* user_seed);
+struct rust_rng {
+    randctx rctx;
+};
+
+void rng_gen_seed(rust_kernel* kernel, uint8_t* dest, size_t size);
+void rng_init(rust_kernel *kernel, rust_rng *rng, rust_vec_box* user_seed);
+uint32_t rng_gen_u32(rust_rng *rng);
 
 //
 // Local Variables:
diff --git a/src/rt/rust_sched_loop.cpp b/src/rt/rust_sched_loop.cpp
index 0d0eaaee962..b15c97ca572 100644
--- a/src/rt/rust_sched_loop.cpp
+++ b/src/rt/rust_sched_loop.cpp
@@ -41,7 +41,7 @@ rust_sched_loop::rust_sched_loop(rust_scheduler *sched, int id, bool killed) :
     name("main")
 {
     LOGPTR(this, "new dom", (uintptr_t)this);
-    isaac_init(kernel, &rctx, NULL);
+    rng_init(kernel, &rng, NULL);
 
     if (!tls_initialized)
         init_tls();
@@ -151,7 +151,7 @@ rust_task *
 rust_sched_loop::schedule_task() {
     lock.must_have_lock();
     if (running_tasks.length() > 0) {
-        size_t k = isaac_rand(&rctx);
+        size_t k = rng_gen_u32(&rng);
         size_t i = k % running_tasks.length();
         return (rust_task *)running_tasks[i];
     }
diff --git a/src/rt/rust_sched_loop.h b/src/rt/rust_sched_loop.h
index 8abec9cf869..736c09ee920 100644
--- a/src/rt/rust_sched_loop.h
+++ b/src/rt/rust_sched_loop.h
@@ -62,7 +62,7 @@ private:
 #endif
 
     context c_context;
-
+    rust_rng rng;
     bool should_exit;
 
     stk_seg *cached_c_stack;
@@ -103,7 +103,6 @@ public:
     size_t min_stack_size;
     memory_region local_region;
 
-    randctx rctx;
     const char *const name; // Used for debugging
 
     // Only a pointer to 'name' is kept, so it must live as long as this