|
@@ -548,8 +548,6 @@ struct _starpu_sched_ctx* _starpu_create_sched_ctx(struct starpu_sched_policy *p
|
|
|
for(w = 0; w < nworkers; w++)
|
|
|
{
|
|
|
sem_init(&sched_ctx->fall_asleep_sem[w], 0, 0);
|
|
|
- sem_init(&sched_ctx->wake_up_sem[w], 0, 0);
|
|
|
-
|
|
|
sched_ctx->parallel_sect[w] = 0;
|
|
|
}
|
|
|
|
|
@@ -2358,14 +2356,6 @@ void _starpu_sched_ctx_signal_worker_blocked(unsigned sched_ctx_id, int workerid
|
|
|
sem_post(&sched_ctx->fall_asleep_sem[sched_ctx->main_master]);
|
|
|
}
|
|
|
|
|
|
-void _starpu_sched_ctx_signal_worker_woke_up(unsigned sched_ctx_id, int workerid)
|
|
|
-{
|
|
|
- struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id);
|
|
|
- struct _starpu_worker *worker = _starpu_get_worker_struct(workerid);
|
|
|
- sem_post(&sched_ctx->wake_up_sem[sched_ctx->main_master]);
|
|
|
- worker->state_blocked_in_ctx = 0;
|
|
|
-}
|
|
|
-
|
|
|
static void _starpu_sched_ctx_put_workers_to_sleep(unsigned sched_ctx_id, unsigned all)
|
|
|
{
|
|
|
struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id);
|
|
@@ -2461,12 +2451,18 @@ static void _starpu_sched_ctx_wake_up_workers(unsigned sched_ctx_id, unsigned al
|
|
|
{
|
|
|
STARPU_ASSERT(worker->state_busy_in_parallel == 1);
|
|
|
worker->state_wait_ack__busy_in_parallel = 0;
|
|
|
+ /* broadcast is required because sched_cond is shared for multiple purpose */
|
|
|
+ STARPU_PTHREAD_COND_BROADCAST(&worker->sched_cond);
|
|
|
+ }
|
|
|
+ worker->state_wait_handshake__busy_in_parallel = 1;
|
|
|
+ do
|
|
|
+ {
|
|
|
+ STARPU_PTHREAD_COND_WAIT(&worker->sched_cond, &worker->sched_mutex);
|
|
|
}
|
|
|
- /* broadcast is required because sched_cond is shared for multiple purpose */
|
|
|
- STARPU_PTHREAD_COND_BROADCAST(&worker->sched_cond);
|
|
|
+ while (worker->state_wait_handshake__busy_in_parallel);
|
|
|
+ worker->state_wait_handshake__busy_in_parallel = 0;
|
|
|
if (!workers_locked)
|
|
|
STARPU_PTHREAD_MUTEX_UNLOCK(&worker->sched_mutex);
|
|
|
- sem_wait(&sched_ctx->wake_up_sem[master]);
|
|
|
}
|
|
|
else
|
|
|
sched_ctx->parallel_sect[workerid] = 0;
|