return 1;
}
-static void td_fill_rand_seeds_internal(struct thread_data *td, int use64)
+static void td_fill_rand_seeds_internal(struct thread_data *td, bool use64)
{
+ int i;
+
init_rand_seed(&td->bsrange_state, td->rand_seeds[FIO_RAND_BS_OFF], use64);
init_rand_seed(&td->verify_state, td->rand_seeds[FIO_RAND_VER_OFF], use64);
- init_rand_seed(&td->rwmix_state, td->rand_seeds[FIO_RAND_MIX_OFF], use64);
+ init_rand_seed(&td->rwmix_state, td->rand_seeds[FIO_RAND_MIX_OFF], false);
if (td->o.file_service_type == FIO_FSERVICE_RANDOM)
init_rand_seed(&td->next_file_state, td->rand_seeds[FIO_RAND_FILE_OFF], use64);
init_rand_seed(&td->trim_state, td->rand_seeds[FIO_RAND_TRIM_OFF], use64);
init_rand_seed(&td->delay_state, td->rand_seeds[FIO_RAND_START_DELAY], use64);
init_rand_seed(&td->poisson_state, td->rand_seeds[FIO_RAND_POISSON_OFF], 0);
+ init_rand_seed(&td->dedupe_state, td->rand_seeds[FIO_DEDUPE_OFF], false);
+ init_rand_seed(&td->zone_state, td->rand_seeds[FIO_RAND_ZONE_OFF], false);
if (!td_random(td))
return;
td->rand_seeds[FIO_RAND_BLOCK_OFF] = FIO_RANDSEED * td->thread_number;
init_rand_seed(&td->random_state, td->rand_seeds[FIO_RAND_BLOCK_OFF], use64);
- init_rand_seed(&td->seq_rand_state[DDIR_READ], td->rand_seeds[FIO_RAND_SEQ_RAND_READ_OFF], use64);
- init_rand_seed(&td->seq_rand_state[DDIR_WRITE], td->rand_seeds[FIO_RAND_SEQ_RAND_WRITE_OFF], use64);
- init_rand_seed(&td->seq_rand_state[DDIR_TRIM], td->rand_seeds[FIO_RAND_SEQ_RAND_TRIM_OFF], use64);
+
+ for (i = 0; i < DDIR_RWDIR_CNT; i++) {
+ struct frand_state *s = &td->seq_rand_state[i];
+
+ init_rand_seed(s, td->rand_seeds[FIO_RAND_SEQ_RAND_READ_OFF], false);
+ }
}
void td_fill_rand_seeds(struct thread_data *td)
{
- int use64;
+ bool use64;
if (td->o.allrand_repeatable) {
unsigned int i;
init_rand_seed(&td->buf_state, td->rand_seeds[FIO_RAND_BUF_OFF], use64);
frand_copy(&td->buf_state_prev, &td->buf_state);
-
- init_rand_seed(&td->dedupe_state, td->rand_seeds[FIO_DEDUPE_OFF], use64);
- init_rand_seed(&td->zone_state, td->rand_seeds[FIO_RAND_ZONE_OFF], use64);
}
/*
/*
* Generate a value, v, between 1 and 100, both inclusive
*/
- v = rand_between(&td->zone_state, 1, 100);
+ v = rand32_between(&td->zone_state, 1, 100);
zsi = &td->zone_state_index[ddir][v - 1];
stotal = zsi->size_perc_prev;
if (td->o.perc_rand[ddir] == 100)
return true;
- v = rand_between(&td->seq_rand_state[ddir], 1, 100);
+ v = rand32_between(&td->seq_rand_state[ddir], 1, 100);
return v <= td->o.perc_rand[ddir];
}
{
unsigned int v;
- v = rand_between(&td->rwmix_state, 1, 100);
+ v = rand32_between(&td->rwmix_state, 1, 100);
if (v <= td->o.rwmix[DDIR_READ])
return DDIR_READ;
return &td->buf_state;
}
- v = rand_between(&td->dedupe_state, 1, 100);
+ v = rand32_between(&td->dedupe_state, 1, 100);
if (v <= td->o.dedupe_percentage)
return &td->buf_state_prev;
return (x < m) ? x + m : x;
}
-static void __init_rand32(struct taus88_state *state, unsigned int seed)
+void __init_rand32(struct taus88_state *state, unsigned int seed)
{
int cranks = 6;
__rand32(state);
}
-static void __init_rand64(struct taus258_state *state, uint64_t seed)
+void __init_rand64(struct taus258_state *state, uint64_t seed)
{
int cranks = 6;
#define FIO_RAND_H
#include <inttypes.h>
+#include <assert.h>
#include "types.h"
#include "../arch/arch.h"
};
};
-struct frand64_state {
- uint64_t s1, s2, s3, s4, s5;
-};
-
static inline uint64_t rand_max(struct frand_state *state)
{
if (state->use64)
/*
* Generate a random value between 'start' and 'end', both inclusive
*/
-static inline int rand_between(struct frand_state *state, int start, int end)
+static inline int rand32_between(struct frand_state *state, int start, int end)
{
- uint64_t r;
+ uint32_t r;
+
+ assert(!state->use64);
- r = __rand(state);
- return start + (int) ((double)end * (r / (rand_max(state) + 1.0)));
+ r = __rand32(&state->state32);
+ return start + (int) ((double)end * (r / (FRAND32_MAX + 1.0)));
}
extern void init_rand(struct frand_state *, bool);
init_rand(&s, false);
for (i = 0; i < nvalues; i++) {
- int v = rand_between(&s, start, end);
+ int v = rand32_between(&s, start, end);
buckets[v - start]++;
}