Bläddra i källkod

be more strict in safe_state broadcast synchro

Olivier Aumage 8 år sedan
förälder
incheckning
6d4fc8101c
2 ändrade filer med 12 tillägg och 0 borttagningar
  1. 6 0
      src/core/workers.c
  2. 6 0
      src/core/workers.h

+ 6 - 0
src/core/workers.c

@@ -1725,8 +1725,14 @@ unsigned starpu_worker_is_blocked_in_parallel(int workerid)
 			 * must enter the relaxed state (if not relaxed
 			 * already) before doing the observation in mutual
 			 * exclusion */
+			STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex);
+
+			STARPU_PTHREAD_MUTEX_LOCK_SCHED(&cur_worker->sched_mutex);
 			cur_worker->state_safe_for_observation = 1;
 			STARPU_PTHREAD_COND_BROADCAST(&cur_worker->sched_cond);
+			STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&cur_worker->sched_mutex);
+
+			STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex);
 		}
 		/* the observer waits for a safe window to observe the state,
 		 * and also waits for any pending blocking state change

+ 6 - 0
src/core/workers.h

@@ -912,8 +912,14 @@ static inline void _starpu_worker_lock(int workerid)
 		int relax_own_observation_state = (cur_worker != NULL) && (cur_worker->state_safe_for_observation == 0);
 		if (relax_own_observation_state && !worker->state_safe_for_observation)
 		{
+			STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex);
+
+			STARPU_PTHREAD_MUTEX_LOCK_SCHED(&cur_worker->sched_mutex);
 			cur_worker->state_safe_for_observation = 1;
 			STARPU_PTHREAD_COND_BROADCAST(&cur_worker->sched_cond);
+			STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&cur_worker->sched_mutex);
+
+			STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex);
 		}
 		while (!worker->state_safe_for_observation)
 		{