diff --git a/src/runner.c b/src/runner.c index 512a4f362fe80caf0441c191f5503e94aec7e763..dc6cc865a64f9ffb873c22060fca544d017341eb 100644 --- a/src/runner.c +++ b/src/runner.c @@ -1656,7 +1656,8 @@ void *runner_main(void *data) { struct runner *r = (struct runner *)data; struct engine *e = r->e; struct scheduler *sched = &e->sched; - + 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 62fce53762e0b3c84396dfb9c54190199b41753b..b75119ffba1171fc8f91ae34f192cb6bd82c455c 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -1305,7 +1305,7 @@ 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((int*)pthread_getspecific(s->local_seed_pointer) ) % s->nr_queues; /* Increase the waiting counter. */ atomic_inc(&s->waiting); @@ -1537,6 +1537,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); scheduler_reset(s, nr_tasks); } diff --git a/src/scheduler.h b/src/scheduler.h index f2225f5f5b8d0a5db54eb8506e02d78b14f4bb88..24bf5f105dbb299153d5dc29d29faeb9240e73f4 100644 --- a/src/scheduler.h +++ b/src/scheduler.h @@ -102,6 +102,8 @@ struct scheduler { /* The node we are working on. */ int nodeID; + + pthread_key_t local_seed_pointer; }; /* Inlined functions (for speed). */