diff --git a/src/runner.c b/src/runner.c index bb5c5cb91c7ca0ab0040f1ff637e124b1c673aeb..99e05de9f6c4932e4428d2a232ff55da8fdba833 100644 --- a/src/runner.c +++ b/src/runner.c @@ -1749,7 +1749,8 @@ void *runner_main(void *data) { struct runner *r = (struct runner *)data; struct engine *e = r->e; struct scheduler *sched = &e->sched; - + unsigned int seed = r->id; + pthread_setspecific(sched->local_seed_pointer, &seed); /* Main loop. */ while (1) { diff --git a/src/scheduler.c b/src/scheduler.c index 4081cde0489b1b439ceb46fc9b4e191541f15bef..6705f410f424d1b58c33f4f9ad6cea1bac5eba0f 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -1377,7 +1377,9 @@ void scheduler_enqueue(struct scheduler *s, struct task *t) { if (qid >= s->nr_queues) error("Bad computed qid."); /* If no previous owner, pick a random queue. */ - if (qid < 0) qid = rand() % s->nr_queues; + if (qid < 0) + qid = rand_r((unsigned int *)pthread_getspecific(s->local_seed_pointer)) % + s->nr_queues; /* Increase the waiting counter. */ atomic_inc(&s->waiting); @@ -1609,6 +1611,7 @@ void scheduler_init(struct scheduler *s, struct space *space, int nr_tasks, s->size = 0; s->tasks = NULL; s->tasks_ind = NULL; + pthread_key_create(&s->local_seed_pointer, NULL); scheduler_reset(s, nr_tasks); } diff --git a/src/scheduler.h b/src/scheduler.h index ac654580b2af2ffb506dc3fd9f0b988b89effbd0..0ef9426ed3248742de619d64f53bdd6b9954ed2c 100644 --- a/src/scheduler.h +++ b/src/scheduler.h @@ -102,6 +102,9 @@ struct scheduler { /* The node we are working on. */ int nodeID; + + /* 'Pointer' to the seed for the random number generator */ + pthread_key_t local_seed_pointer; }; /* Inlined functions (for speed). */