Bläddra i källkod

fix case where a worker blocking state has been observed _and_ a sched_ctx change is ongoing, while about to start a new sched_op

Olivier Aumage 8 år sedan
förälder
incheckning
94218c2029
1 ändrade filer med 13 tillägg och 3 borttagningar
  1. 13 3
      src/core/workers.h

+ 13 - 3
src/core/workers.h

@@ -758,9 +758,6 @@ static inline void _starpu_worker_process_block_in_parallel_requests(struct _sta
  * should not be modified */
 static inline void _starpu_worker_enter_sched_op(struct _starpu_worker * const worker)
 {
-	/* if someone observed the worker state since the last call, postpone block request
-	 * processing for one sched_op turn more, because the observer will not have seen
-	 * new block requests between its observation and now */
 	if (!worker->state_blocked_in_parallel_observed)
 	{
 		/* process pending block requests before entering a sched_op region */
@@ -774,6 +771,19 @@ static inline void _starpu_worker_enter_sched_op(struct _starpu_worker * const w
 			_starpu_worker_process_block_in_parallel_requests(worker);
 		}
 	}
+	else
+	{
+		/* if someone observed the worker state since the last call, postpone block request
+		 * processing for one sched_op turn more, because the observer will not have seen
+		 * new block requests between its observation and now.
+		 *
+		 * however, the worker still has to wait for context change operations to complete
+		 * before entering sched_op again*/
+		while (worker->state_changing_ctx_notice)
+		{
+			STARPU_PTHREAD_COND_WAIT(&worker->sched_cond, &worker->sched_mutex);
+		}
+	}
 
 	/* no block request and no ctx change ahead,
 	 * enter sched_op */