This is pretty crappy on FreeBSD, the seed function doesn't seed the
state we want. But it works, so it'll have to suffice for now...
- lrand48_r(&td->random_state, &r);
+ r = os_random_long(&td->random_state);
b = ((max_blocks - 1) * r / (unsigned long long) (RAND_MAX+1.0));
rb = b + (td->file_offset / td->min_bs);
loops--;
b = ((max_blocks - 1) * r / (unsigned long long) (RAND_MAX+1.0));
rb = b + (td->file_offset / td->min_bs);
loops--;
if (td->min_bs == td->max_bs)
buflen = td->min_bs;
else {
if (td->min_bs == td->max_bs)
buflen = td->min_bs;
else {
- lrand48_r(&td->bsrange_state, &r);
+ r = os_random_long(&td->bsrange_state);
buflen = (1 + (double) (td->max_bs - 1) * r / (RAND_MAX + 1.0));
buflen = (buflen + td->min_bs - 1) & ~(td->min_bs - 1);
}
buflen = (1 + (double) (td->max_bs - 1) * r / (RAND_MAX + 1.0));
buflen = (buflen + td->min_bs - 1) & ~(td->min_bs - 1);
}
- drand48_r(&td->verify_state, &r);
+ r = os_random_double(&td->verify_state);
/*
* lrand48_r seems to be broken and only fill the bottom
/*
* lrand48_r seems to be broken and only fill the bottom
- lrand48_r(&td->random_state, &r);
+ r = os_random_long(&td->random_state);
v = 100UL * r / (unsigned long) (RAND_MAX + 1.0);
if (v < td->rwmixread)
td->rwmix_ddir = DDIR_READ;
v = 100UL * r / (unsigned long) (RAND_MAX + 1.0);
if (v < td->rwmixread)
td->rwmix_ddir = DDIR_READ;
- struct drand48_data bsrange_state;
- struct drand48_data verify_state;
+ os_random_state_t bsrange_state;
+ os_random_state_t verify_state;
unsigned long long last_pos;
sem_t mutex;
unsigned long long last_pos;
sem_t mutex;
- struct drand48_data random_state;
+ os_random_state_t random_state;
unsigned long *file_map;
unsigned int num_maps;
unsigned long *file_map;
unsigned int num_maps;
unsigned int do_disk_util;
unsigned int override_sync;
unsigned int do_disk_util;
unsigned int override_sync;
- struct drand48_data rwmix_state;
+ os_random_state_t rwmix_state;
struct timeval rwmix_switch;
int rwmix_ddir;
struct timeval rwmix_switch;
int rwmix_ddir;
- srand48_r(seeds[0], &td->bsrange_state);
- srand48_r(seeds[1], &td->verify_state);
- srand48_r(seeds[2], &td->rwmix_state);
+ os_random_seed(seeds[0], &td->bsrange_state);
+ os_random_seed(seeds[1], &td->verify_state);
+ os_random_seed(seeds[2], &td->rwmix_state);
if (td->sequential)
return 0;
if (td->sequential)
return 0;
td->num_maps = num_maps;
memset(td->file_map, 0, num_maps * sizeof(long));
td->num_maps = num_maps;
memset(td->file_map, 0, num_maps * sizeof(long));
- srand48_r(seeds[3], &td->random_state);
+ os_random_seed(seeds[3], &td->random_state);
#define OS_MAP_ANON (MAP_ANON)
typedef unsigned long os_cpu_mask_t;
#define OS_MAP_ANON (MAP_ANON)
typedef unsigned long os_cpu_mask_t;
+typedef unsigned int os_random_state_t;
+static inline void os_random_seed(unsigned long seed, os_random_state_t *rs)
+{
+ srand(seed);
+}
+
+static inline long os_random_long(os_random_state_t *rs)
+{
+ long val;
+
+ val = rand_r(rs);
+ return val;
+}
+
+static inline double os_random_double(os_random_state_t *rs)
+{
+ double val;
+
+ val = (double) rand_r(rs);
+ return val;
+}
#define OS_MAP_ANON (MAP_ANONYMOUS)
typedef cpu_set_t os_cpu_mask_t;
#define OS_MAP_ANON (MAP_ANONYMOUS)
typedef cpu_set_t os_cpu_mask_t;
+typedef struct drand48_data os_random_state_t;
/*
* we want fadvise64 really, but it's so tangled... later
/*
* we want fadvise64 really, but it's so tangled... later
return (unsigned long long) pages * (unsigned long long) pagesize;
}
return (unsigned long long) pages * (unsigned long long) pagesize;
}
+static inline void os_random_seed(unsigned long seed, os_random_state_t *rs)
+{
+ srand48_r(seed, rs);
+}
+
+static inline long os_random_long(os_random_state_t *rs)
+{
+ long val;
+
+ lrand48_r(rs, &val);
+ return val;
+}
+
+static inline double os_random_double(os_random_state_t *rs)
+{
+ double val;
+
+ drand48_r(rs, &val);
+ return val;
+}
+