diff --git a/src/cats/threading/threading-helpers.c b/src/cats/threading/threading-helpers.c index 1a8ff5d82ed210f7203b70324d1d29cca067b946..d8009004dc0cb11c55d18682252372d393429b9d 100644 --- a/src/cats/threading/threading-helpers.c +++ b/src/cats/threading/threading-helpers.c @@ -50,10 +50,21 @@ initialize_thread(struct cats_thread_info *thread, struct cats_grid *grid, struc zero_statistics_stats(&thread->stats[i]); } + thread->temp = 0; + thread->temp1 = 0; + thread->temp2 = 0; + thread->seed = get_random_seed(false); + for (int i = 0; i < 4; i++) { + thread->seed4[i] = get_random_seed64(false); + } thread->id = id; thread->grid = grid; thread->conf = conf; + thread->rng_buf_size = 32; + thread->rng_state_buffer = calloc_or_die(1, thread->rng_buf_size); + thread->rng_state = calloc_or_die(1, sizeof(struct random_data)); + initstate_r(get_random_seed(false), thread->rng_state_buffer, thread->rng_buf_size, thread->rng_state); } @@ -65,8 +76,12 @@ int32_t get_dispersal_radius(const struct cats_configuration *conf, int32_t id) void cleanup_threads(struct cats_thread_info *threads, int32_t num_threads) { + for (int32_t i = 0; i < num_threads; i++) { + gsl_rng_free(threads[i].rng); + free(threads[i].rng_state); + free(threads[i].rng_state_buffer); } for (int32_t i = 0; i < num_threads; i++) { @@ -75,6 +90,8 @@ void cleanup_threads(struct cats_thread_info *threads, int32_t num_threads) } } free(threads); + + } diff --git a/src/cats/threading/threading.c b/src/cats/threading/threading.c index e593f2c302f4f403039f6595adefea93bad99d37..539fd2b938190e14846a3264f422c9fcae8cd052 100644 --- a/src/cats/threading/threading.c +++ b/src/cats/threading/threading.c @@ -94,6 +94,8 @@ setup_threads(struct cats_configuration *conf, struct cats_grid *grid, int32_t m } + + switch (t->strategy) { case TS_UNKNOWN: log_message(LOG_ERROR, "undefined threading strategy"); diff --git a/src/cats/threading/threading.h b/src/cats/threading/threading.h index 3fe950ff6c863453b151c108661cfac119dd6a79..c025c7898cd7740de0c9c67d9d7ce3774b2b6d10 100644 --- a/src/cats/threading/threading.h +++ b/src/cats/threading/threading.h @@ -53,6 +53,11 @@ struct cats_thread_info { int64_t temp; int64_t temp1; int64_t temp2; + char *rng_state_buffer; + int32_t rng_buf_size; + struct random_data *rng_state; + unsigned int seed; + uint64_t seed4[4]; };