Skip to content

Commit 31f8526

Browse files
committed
---
yaml --- r: 46383 b: refs/heads/auto c: 968ab03 h: refs/heads/master i: 46381: 8198c98 46379: 7e2cf14 46375: 3620518 46367: fa99e62 v: v3
1 parent aad5d38 commit 31f8526

File tree

7 files changed

+65
-67
lines changed

7 files changed

+65
-67
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,4 @@ refs/heads/try3: 9387340aab40a73e8424c48fd42f0c521a4875c0
1414
refs/tags/release-0.3.1: 495bae036dfe5ec6ceafd3312b4dca48741e845b
1515
refs/tags/release-0.4: e828ea2080499553b97dfe33b3f4d472b4562ad7
1616
refs/tags/release-0.5: 7e3bcfbf21278251ee936ad53e92e9b719702d73
17-
refs/heads/auto: a8efa2133392cc846d4ea3cae14f0eb4eccb5f1e
17+
refs/heads/auto: 968ab03026d716f1e648aadebe8f199bdacbe4ad

branches/auto/src/libcore/rand.rs

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use u32;
1818
use uint;
1919
use util;
2020
use vec;
21+
use libc::size_t;
2122

2223
/// A type that can be randomly generated using an RNG
2324
pub trait Rand {
@@ -120,9 +121,9 @@ enum rust_rng {}
120121

121122
#[abi = "cdecl"]
122123
extern mod rustrt {
123-
unsafe fn rand_seed() -> ~[u8];
124-
unsafe fn rand_new() -> *rust_rng;
125-
unsafe fn rand_new_seeded2(&&seed: ~[u8]) -> *rust_rng;
124+
unsafe fn rand_seed_size() -> size_t;
125+
unsafe fn rand_gen_seed(buf: *mut u8, sz: size_t);
126+
unsafe fn rand_new_seeded(buf: *u8, sz: size_t) -> *rust_rng;
126127
unsafe fn rand_next(rng: *rust_rng) -> u32;
127128
unsafe fn rand_free(rng: *rust_rng);
128129
}
@@ -388,15 +389,18 @@ impl Rng for @RandRes {
388389
/// Create a new random seed for seeded_rng
389390
pub fn seed() -> ~[u8] {
390391
unsafe {
391-
rustrt::rand_seed()
392+
let n = rustrt::rand_seed_size() as uint;
393+
let mut s = vec::from_elem(n, 0_u8);
394+
do vec::as_mut_buf(s) |p, sz| {
395+
rustrt::rand_gen_seed(p, sz as size_t)
396+
}
397+
s
392398
}
393399
}
394400

395401
/// Create a random number generator with a system specified seed
396402
pub fn Rng() -> Rng {
397-
unsafe {
398-
@RandRes(rustrt::rand_new()) as Rng
399-
}
403+
seeded_rng(seed())
400404
}
401405

402406
/**
@@ -405,9 +409,15 @@ pub fn Rng() -> Rng {
405409
* all other generators constructed with the same seed. The seed may be any
406410
* length.
407411
*/
408-
pub fn seeded_rng(seed: &~[u8]) -> Rng {
412+
pub fn seeded_rng(seed: &[u8]) -> Rng {
413+
seeded_randres(seed) as Rng
414+
}
415+
416+
fn seeded_randres(seed: &[u8]) -> @RandRes {
409417
unsafe {
410-
@RandRes(rustrt::rand_new_seeded2(*seed)) as Rng
418+
do vec::as_imm_buf(seed) |p, sz| {
419+
@RandRes(rustrt::rand_new_seeded(p, sz as size_t))
420+
}
411421
}
412422
}
413423

@@ -457,7 +467,7 @@ pub fn task_rng() -> Rng {
457467
match r {
458468
None => {
459469
unsafe {
460-
let rng = @RandRes(rustrt::rand_new());
470+
let rng = seeded_randres(seed());
461471
task::local_data::local_data_set(tls_rng_state, rng);
462472
rng as Rng
463473
}
@@ -483,24 +493,24 @@ pub mod tests {
483493
#[test]
484494
pub fn rng_seeded() {
485495
let seed = rand::seed();
486-
let ra = rand::seeded_rng(&seed);
487-
let rb = rand::seeded_rng(&seed);
496+
let ra = rand::seeded_rng(seed);
497+
let rb = rand::seeded_rng(seed);
488498
assert ra.gen_str(100u) == rb.gen_str(100u);
489499
}
490500

491501
#[test]
492502
pub fn rng_seeded_custom_seed() {
493503
// much shorter than generated seeds which are 1024 bytes
494-
let seed = ~[2u8, 32u8, 4u8, 32u8, 51u8];
495-
let ra = rand::seeded_rng(&seed);
496-
let rb = rand::seeded_rng(&seed);
504+
let seed = [2u8, 32u8, 4u8, 32u8, 51u8];
505+
let ra = rand::seeded_rng(seed);
506+
let rb = rand::seeded_rng(seed);
497507
assert ra.gen_str(100u) == rb.gen_str(100u);
498508
}
499509

500510
#[test]
501511
pub fn rng_seeded_custom_seed2() {
502-
let seed = ~[2u8, 32u8, 4u8, 32u8, 51u8];
503-
let ra = rand::seeded_rng(&seed);
512+
let seed = [2u8, 32u8, 4u8, 32u8, 51u8];
513+
let ra = rand::seeded_rng(seed);
504514
// Regression test that isaac is actually using the above vector
505515
let r = ra.next();
506516
error!("%?", r);

branches/auto/src/rt/rust_builtin.cpp

Lines changed: 8 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -128,49 +128,30 @@ vec_reserve_shared(type_desc* ty, rust_vec_box** vp,
128128
reserve_vec_exact(task, vp, n_elts * ty->size);
129129
}
130130

131-
extern "C" CDECL rust_vec*
132-
rand_seed() {
133-
size_t size = sizeof(ub4) * RANDSIZ;
134-
rust_task *task = rust_get_current_task();
135-
rust_vec *v = (rust_vec *) task->kernel->malloc(vec_size<uint8_t>(size),
136-
"rand_seed");
137-
v->fill = v->alloc = size;
138-
rng_gen_seed(task->kernel, (uint8_t*) &v->data, size);
139-
return v;
131+
extern "C" CDECL size_t
132+
rand_seed_size() {
133+
return rng_seed_size();
140134
}
141135

142-
extern "C" CDECL void *
143-
rand_new() {
136+
extern "C" CDECL void
137+
rand_gen_seed(uint8_t* dest, size_t size) {
144138
rust_task *task = rust_get_current_task();
145-
rust_sched_loop *thread = task->sched_loop;
146-
rust_rng *rng = (rust_rng *) task->malloc(sizeof(rust_rng), "rand_new");
147-
if (!rng) {
148-
task->fail();
149-
return NULL;
150-
}
151-
rng_init(thread->kernel, rng, NULL);
152-
return rng;
139+
rng_gen_seed(task->kernel, dest, size);
153140
}
154141

155142
extern "C" CDECL void *
156-
rand_new_seeded(rust_vec_box* seed) {
143+
rand_new_seeded(uint8_t* seed, size_t seed_size) {
157144
rust_task *task = rust_get_current_task();
158-
rust_sched_loop *thread = task->sched_loop;
159145
rust_rng *rng = (rust_rng *) task->malloc(sizeof(rust_rng),
160146
"rand_new_seeded");
161147
if (!rng) {
162148
task->fail();
163149
return NULL;
164150
}
165-
rng_init(thread->kernel, rng, seed);
151+
rng_init(task->kernel, rng, seed, seed_size);
166152
return rng;
167153
}
168154

169-
extern "C" CDECL void *
170-
rand_new_seeded2(rust_vec_box** seed) {
171-
return rand_new_seeded(*seed);
172-
}
173-
174155
extern "C" CDECL uint32_t
175156
rand_next(rust_rng *rng) {
176157
rust_task *task = rust_get_current_task();

branches/auto/src/rt/rust_rng.cpp

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@
1212
#include "rust_rng.h"
1313
#include "rust_util.h"
1414

15+
size_t
16+
rng_seed_size() {
17+
randctx rctx;
18+
return sizeof(rctx.randrsl);
19+
}
20+
1521
// Initialization helpers for ISAAC RNG
1622

1723
void
@@ -48,31 +54,36 @@ rng_gen_seed(rust_kernel* kernel, uint8_t* dest, size_t size) {
4854
}
4955

5056
static void
51-
isaac_init(rust_kernel *kernel, randctx *rctx, rust_vec_box* user_seed) {
57+
isaac_init(rust_kernel *kernel, randctx *rctx,
58+
uint8_t* user_seed, size_t seed_len) {
5259
memset(rctx, 0, sizeof(randctx));
5360

5461
char *env_seed = kernel->env->rust_seed;
5562
if (user_seed != NULL) {
5663
// ignore bytes after the required length
57-
size_t seed_len = user_seed->body.fill < sizeof(rctx->randrsl)
58-
? user_seed->body.fill : sizeof(rctx->randrsl);
59-
memcpy(&rctx->randrsl, user_seed->body.data, seed_len);
64+
if (seed_len > sizeof(rctx->randrsl)) {
65+
seed_len = sizeof(rctx->randrsl);
66+
}
67+
memcpy(&rctx->randrsl, user_seed, seed_len);
6068
} else if (env_seed != NULL) {
6169
ub4 seed = (ub4) atoi(env_seed);
6270
for (size_t i = 0; i < RANDSIZ; i ++) {
6371
memcpy(&rctx->randrsl[i], &seed, sizeof(ub4));
6472
seed = (seed + 0x7ed55d16) + (seed << 12);
6573
}
6674
} else {
67-
rng_gen_seed(kernel, (uint8_t*)&rctx->randrsl, sizeof(rctx->randrsl));
75+
rng_gen_seed(kernel,
76+
(uint8_t*)&rctx->randrsl,
77+
sizeof(rctx->randrsl));
6878
}
6979

7080
randinit(rctx, 1);
7181
}
7282

7383
void
74-
rng_init(rust_kernel* kernel, rust_rng* rng, rust_vec_box* user_seed) {
75-
isaac_init(kernel, &rng->rctx, user_seed);
84+
rng_init(rust_kernel* kernel, rust_rng* rng,
85+
uint8_t *user_seed, size_t seed_len) {
86+
isaac_init(kernel, &rng->rctx, user_seed, seed_len);
7687
rng->reseedable = !user_seed && !kernel->env->rust_seed;
7788
}
7889

@@ -85,15 +96,9 @@ rng_maybe_reseed(rust_kernel* kernel, rust_rng* rng) {
8596
if (bytes_generated < RESEED_THRESHOLD || !rng->reseedable) {
8697
return;
8798
}
88-
89-
uint32_t new_seed[RANDSIZ];
90-
rng_gen_seed(kernel, (uint8_t*) new_seed, RANDSIZ * sizeof(uint32_t));
91-
92-
// Stir new seed into PRNG's entropy pool.
93-
for (size_t i = 0; i < RANDSIZ; i++) {
94-
rng->rctx.randrsl[i] ^= new_seed[i];
95-
}
96-
99+
rng_gen_seed(kernel,
100+
(uint8_t*)rng->rctx.randrsl,
101+
sizeof(rng->rctx.randrsl));
97102
randinit(&rng->rctx, 1);
98103
}
99104

branches/auto/src/rt/rust_rng.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
#include "rand.h"
1515

1616
class rust_kernel;
17-
struct rust_vec_box;
1817

1918
// Initialization helpers for ISAAC RNG
2019

@@ -23,8 +22,11 @@ struct rust_rng {
2322
bool reseedable;
2423
};
2524

26-
void rng_gen_seed(rust_kernel* kernel, uint8_t* dest, size_t size);
27-
void rng_init(rust_kernel *kernel, rust_rng *rng, rust_vec_box* user_seed);
25+
size_t rng_seed_size();
26+
void rng_gen_seed(rust_kernel* kernel,
27+
uint8_t* dest, size_t size);
28+
void rng_init(rust_kernel *kernel, rust_rng *rng,
29+
uint8_t *user_seed, size_t seed_len);
2830
uint32_t rng_gen_u32(rust_kernel *kernel, rust_rng *rng);
2931

3032
//

branches/auto/src/rt/rust_sched_loop.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ rust_sched_loop::rust_sched_loop(rust_scheduler *sched, int id, bool killed) :
4141
name("main")
4242
{
4343
LOGPTR(this, "new dom", (uintptr_t)this);
44-
rng_init(kernel, &rng, NULL);
44+
rng_init(kernel, &rng, NULL, 0);
4545

4646
if (!tls_initialized)
4747
init_tls();

branches/auto/src/rt/rustrt.def.in

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ rust_mktime
1717
new_task
1818
precise_time_ns
1919
rand_free
20-
rand_new
2120
rand_new_seeded
22-
rand_new_seeded2
21+
rand_seed_size
22+
rand_gen_seed
2323
rand_next
2424
rand_seed
2525
rust_get_sched_id

0 commit comments

Comments
 (0)