Skip to content

Commit 1252064

Browse files
committed
rt: Eliminate the dependency on rust_kernel from rust_rng
1 parent 5b0bb76 commit 1252064

File tree

4 files changed

+36
-34
lines changed

4 files changed

+36
-34
lines changed

src/rt/rust_builtin.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,7 @@ rand_seed_size() {
8888

8989
extern "C" CDECL void
9090
rand_gen_seed(uint8_t* dest, size_t size) {
91-
rust_task *task = rust_get_current_task();
92-
rng_gen_seed(task->kernel, dest, size);
91+
rng_gen_seed(dest, size);
9392
}
9493

9594
extern "C" CDECL void *
@@ -101,14 +100,14 @@ rand_new_seeded(uint8_t* seed, size_t seed_size) {
101100
task->fail();
102101
return NULL;
103102
}
104-
rng_init(task->kernel, rng, seed, seed_size);
103+
char *env_seed = task->kernel->env->rust_seed;
104+
rng_init(rng, env_seed, seed, seed_size);
105105
return rng;
106106
}
107107

108108
extern "C" CDECL uint32_t
109109
rand_next(rust_rng *rng) {
110-
rust_task *task = rust_get_current_task();
111-
return rng_gen_u32(task->kernel, rng);
110+
return rng_gen_u32(rng);
112111
}
113112

114113
extern "C" CDECL void

src/rt/rust_rng.cpp

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ rng_seed_size() {
4141
// Initialization helpers for ISAAC RNG
4242

4343
void
44-
rng_gen_seed(rust_kernel* kernel, uint8_t* dest, size_t size) {
44+
rng_gen_seed(uint8_t* dest, size_t size) {
4545
#ifdef __WIN32__
4646
HCRYPTPROV hProv;
4747
win32_require
@@ -54,31 +54,37 @@ rng_gen_seed(rust_kernel* kernel, uint8_t* dest, size_t size) {
5454
(_T("CryptReleaseContext"), CryptReleaseContext(hProv, 0));
5555
#else
5656
int fd = open("/dev/urandom", O_RDONLY);
57-
if (fd == -1)
58-
kernel->fatal("error opening /dev/urandom: %s", strerror(errno));
57+
if (fd == -1) {
58+
fprintf(stderr, "error opening /dev/urandom: %s", strerror(errno));
59+
abort();
60+
}
5961
size_t amount = 0;
6062
do {
6163
ssize_t ret = read(fd, dest+amount, size-amount);
62-
if (ret < 0)
63-
kernel->fatal("error reading /dev/urandom: %s", strerror(errno));
64-
else if (ret == 0)
65-
kernel->fatal("somehow hit eof reading from /dev/urandom");
64+
if (ret < 0) {
65+
fprintf(stderr, "error reading /dev/urandom: %s", strerror(errno));
66+
abort();
67+
}
68+
else if (ret == 0) {
69+
fprintf(stderr, "somehow hit eof reading from /dev/urandom");
70+
abort();
71+
}
6672
amount += (size_t)ret;
6773
} while (amount < size);
6874
int ret = close(fd);
69-
// FIXME #3697: Why does this fail sometimes?
70-
if (ret != 0)
71-
kernel->log(log_warn, "error closing /dev/urandom: %s",
72-
strerror(errno));
75+
if (ret != 0) {
76+
fprintf(stderr, "error closing /dev/urandom: %s", strerror(errno));
77+
// FIXME #3697: Why does this fail sometimes?
78+
// abort();
79+
}
7380
#endif
7481
}
7582

7683
static void
77-
isaac_init(rust_kernel *kernel, randctx *rctx,
84+
isaac_init(randctx *rctx, char *env_seed,
7885
uint8_t* user_seed, size_t seed_len) {
7986
memset(rctx, 0, sizeof(randctx));
8087

81-
char *env_seed = kernel->env->rust_seed;
8288
if (user_seed != NULL) {
8389
// ignore bytes after the required length
8490
if (seed_len > sizeof(rctx->randrsl)) {
@@ -92,40 +98,38 @@ isaac_init(rust_kernel *kernel, randctx *rctx,
9298
seed = (seed + 0x7ed55d16) + (seed << 12);
9399
}
94100
} else {
95-
rng_gen_seed(kernel,
96-
(uint8_t*)&rctx->randrsl,
101+
rng_gen_seed((uint8_t*)&rctx->randrsl,
97102
sizeof(rctx->randrsl));
98103
}
99104

100105
randinit(rctx, 1);
101106
}
102107

103108
void
104-
rng_init(rust_kernel* kernel, rust_rng* rng,
109+
rng_init(rust_rng* rng, char* env_seed,
105110
uint8_t *user_seed, size_t seed_len) {
106-
isaac_init(kernel, &rng->rctx, user_seed, seed_len);
107-
rng->reseedable = !user_seed && !kernel->env->rust_seed;
111+
isaac_init(&rng->rctx, env_seed, user_seed, seed_len);
112+
rng->reseedable = !user_seed && !env_seed;
108113
}
109114

110115
static void
111-
rng_maybe_reseed(rust_kernel* kernel, rust_rng* rng) {
116+
rng_maybe_reseed(rust_rng* rng) {
112117
// If this RNG has generated more than 32KB of random data and was not
113118
// seeded by the user or RUST_SEED, then we should reseed now.
114119
const size_t RESEED_THRESHOLD = 32 * 1024;
115120
size_t bytes_generated = rng->rctx.randc * sizeof(ub4);
116121
if (bytes_generated < RESEED_THRESHOLD || !rng->reseedable) {
117122
return;
118123
}
119-
rng_gen_seed(kernel,
120-
(uint8_t*)rng->rctx.randrsl,
124+
rng_gen_seed((uint8_t*)rng->rctx.randrsl,
121125
sizeof(rng->rctx.randrsl));
122126
randinit(&rng->rctx, 1);
123127
}
124128

125129
uint32_t
126-
rng_gen_u32(rust_kernel* kernel, rust_rng* rng) {
130+
rng_gen_u32(rust_rng* rng) {
127131
uint32_t x = isaac_rand(&rng->rctx);
128-
rng_maybe_reseed(kernel, rng);
132+
rng_maybe_reseed(rng);
129133
return x;
130134
}
131135

src/rt/rust_rng.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,10 @@ struct rust_rng {
2323
};
2424

2525
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,
26+
void rng_gen_seed(uint8_t* dest, size_t size);
27+
void rng_init(rust_rng *rng, char *env_seed,
2928
uint8_t *user_seed, size_t seed_len);
30-
uint32_t rng_gen_u32(rust_kernel *kernel, rust_rng *rng);
29+
uint32_t rng_gen_u32(rust_rng *rng);
3130

3231
//
3332
// Local Variables:

src/rt/rust_sched_loop.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ rust_sched_loop::rust_sched_loop(rust_scheduler *sched, int id, bool killed) :
4343
name("main")
4444
{
4545
LOGPTR(this, "new dom", (uintptr_t)this);
46-
rng_init(kernel, &rng, NULL, 0);
46+
rng_init(&rng, kernel->env->rust_seed, NULL, 0);
4747

4848
if (!tls_initialized)
4949
init_tls();
@@ -154,7 +154,7 @@ rust_sched_loop::schedule_task() {
154154
lock.must_have_lock();
155155
size_t tasks = running_tasks.length();
156156
if (tasks > 0) {
157-
size_t i = (tasks > 1) ? (rng_gen_u32(kernel, &rng) % tasks) : 0;
157+
size_t i = (tasks > 1) ? (rng_gen_u32(&rng) % tasks) : 0;
158158
return running_tasks[i];
159159
}
160160
return NULL;

0 commit comments

Comments
 (0)